是否可以使用Acrobat.dll在c#应用程序中打开PDF?

时间:2009-01-09 19:51:37

标签: c# acrobat

我知道我可以在我的c#可执行文件(不是网络应用程序)中显示PDF文件:

private AxAcroPDFLib.AxAcroPDF axAcroPDF1;
axAcroPDF1.LoadFile(@"somefile.pdf");
axAcroPDF1.Show();

但这是浏览器中常规的pdf查看器。我不希望这样。我希望使用Adobe控件在我的C#应用​​程序中使用完整的Adobe Standard或Professional功能。例如,如果我使用上面的代码,它会加载到C#应用程序中,我可以看到adobe工具栏(打印,保存等)但它对我来说没用,因为我需要像active这样无法完成的东西观众上面。具体来说,你无法保存,就像你不能在broswer中一样。

所以,我引用了acrobat.dll并尝试使用:

Acrobat.AcroAVDocClass _acroDoc = new Acrobat.AcroAVDocClass();
Acrobat.AcroApp _myAdobe = new Acrobat.AcroApp();
Acrobat.AcroPDDoc _pdDoc = null;
_acroDoc.Open(myPath, "test");
pdDoc = (Acrobat.AcroPDDoc)(_acroDoc.GetPDDoc());
_acroDoc.SetViewMode(2);
_myAdobe.Show();

它会打开adobe acrobat,但它会在我的c#应用程序之外打开它。我需要它在我的c#应用程序中打开,就像activex库一样。可以用这些库来完成吗?

如果我无法在我的c#应用程序中打开它,我希望能够“保持”与我绑定的c#应用程序,以便c#app知道何时关闭adobe应用程序。至少我会有一些控制措施。这意味着我会打开,adobe应用程序打开。我关闭了adobe应用程序,我的C#应用​​程序知道这一点,并使用activex库加载新更改的文档(因为我不再需要更改功能,只是显示。)

我的计算机上安装了完整版的adobe acrobat。它不是读者。

感谢您的帮助。

编辑: adobe acrobat sdk中的vb中有一个例子。我相信它被称为activeview。

4 个答案:

答案 0 :(得分:2)

你可以查看ABCpdf。我不知道它是否具备此功能,但我们已将它用于我们的几个应用程序

答案 1 :(得分:1)

使用webbrowser控件可以显示内容。

答案 2 :(得分:0)

IText#可能会帮助你。

您可以创建PDF,我相信您可以使用它来阅读和修改它们。

至于在应用程序中显示.....我不知道如何用iText显示它们或者是否可能(尚未尝试过),抱歉。 iText确实允许您转换为RTF,这可能是一种方法。

答案 3 :(得分:0)

最佳选择是编写一个侦听器,在Adobe.exe不再运行时告诉您的调用代码。以下内容(对您的用途进行调整)应该有效:

public void Open(string myPath)
{
    Acrobat.AcroAVDocClass _acroDoc = new Acrobat.AcroAVDocClass();
    Acrobat.AcroApp _myAdobe = new Acrobat.AcroApp();
    Acrobat.AcroPDDoc _pdDoc = null;
    _acroDoc.Open(myPath, "test");
    _pdDoc = (Acrobat.AcroPDDoc) (_acroDoc.GetPDDoc());
    _acroDoc.SetViewMode(2);
    _myAdobe.Show();
    NotifyAdobeClosed += new EventHandler(Monitor_NotifyAdobeClosed);
    MonitorAdobe();
}
private void Monitor_NotifyAdobeClosed(object sender, EventArgs e)
{
    NotifyAdobeClosed -= Monitor_NotifyAdobeClosed;
    //Do whatever it is you want to do when adobe is closed.
}

private void MonitorAdobe()
{
    while(true)
    {
        var adcount = (from p in Process.GetProcesses()
                       where p.ProcessName.ToLower() == "acrobat"
                       select p).Count();
        if (adcount == 0)
        {
            OnNotifyAdobeClosed();
            break;
        }
    }
}

public event EventHandler NotifyAdobeClosed;
public void OnNotifyAdobeClosed()
{
    if (NotifyAdobeClosed != null)
        NotifyAdobeClosed(this, null);
}