c# - 在 WinForms 中托管 IE 8 并打开 PDF

标签 c# vb.net file internet-explorer-8 acrobat

我们有一个承载 WebBrowser 控件的窗体。这是表单上唯一的控件。

我们将临时 PDF 文件的文件路径传递给表单,它会:

WebBrowser1.Navigate(Me._PathToPdf)

当表单关闭时,它会离开 PDF 文件:

WebBrowser1.Hide()
WebBrowser1.Navigate("about:blank")

Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    Application.DoEvents()
    System.Threading.Thread.Sleep(50)
Loop

表单关闭后,调用类会删除临时 PDF 文件。

在我们安装 Internet Explorer 8 之前,这个过程非常有效。出于某种原因,IE8 和 Adob​​e Acrobat 8​​(或 9)的组合导致在临时 PDF 文件上放置一个额外的文件锁定句柄。在整个应用程序关闭之前,额外的锁句柄不会消失。我还应该提到,在 Acrobat 打开文件之前,文件没有锁定。

我们可以在多台机器上重现它,它始终是 IE8 和 Adob​​e Acrobat Reader 的组合。我们可以安装 Foxit Reader 3 而不是 Adob​​e Acrobat,一切正常。同样,我们可以在装有 IE7 和 Adob​​e Acrobat 的机器上运行该应用程序,一切正常。但是,当你混合使用 IE 8 和 Acrobat 的魔药时,你最终会变得一团糟。

谁能告诉我为什么我会得到一个持续到应用程序结束的额外文件锁?

谢谢。

可在此处找到演示我的问题的示例应用程序:PDFLockProblemDemo.zip

最佳答案

在我看来,真正的问题是使用 WebBrowser 控件来托管 Adob​​e Reader 网络浏览器插件来显示 PDF。有没有更好的方法可以直接显示 PDF 而无需引入对网络浏览器的依赖? Adobe 不提供可以直接在表单中托管的 SDK 或 ActiveX 控件吗?


更新:我环顾四周,发现 this post他们访问 Adob​​e ActiveX 控件 (AxAcroPDFLib.AxAcroPDF) 并简单地调用:

axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();

关于c# - 在 WinForms 中托管 IE 8 并打开 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809442/

相关文章:

vb.net - 如何在不启动对象的情况下获取类的类型?

excel - 从 Visual Studio 调用 excel 工作簿中的 VBA 宏

c++ - 读取 txt 文件时出现 "Debug Assertion Failed"

c# - event 关键字的真正作用是什么?

c# - 在 Scala 中实现类似 LINQ 的功能

c# - 对象销毁和空链接

vb.net - 如何在图像上绘制矩形并将其保存在 VB.Net 中

C# tcp 流 - 是否可以在没有监听器的情况下运行流?

Java:关于写入的空白文件

ruby-on-rails - Paperclip 不支持 .doc 文件