我们有一个承载 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 和 Adobe Acrobat 8(或 9)的组合导致在临时 PDF 文件上放置一个额外的文件锁定句柄。在整个应用程序关闭之前,额外的锁句柄不会消失。我还应该提到,在 Acrobat 打开文件之前,文件没有锁定。
我们可以在多台机器上重现它,它始终是 IE8 和 Adobe Acrobat Reader 的组合。我们可以安装 Foxit Reader 3 而不是 Adobe Acrobat,一切正常。同样,我们可以在装有 IE7 和 Adobe Acrobat 的机器上运行该应用程序,一切正常。但是,当你混合使用 IE 8 和 Acrobat 的魔药时,你最终会变得一团糟。
谁能告诉我为什么我会得到一个持续到应用程序结束的额外文件锁?
谢谢。
可在此处找到演示我的问题的示例应用程序:PDFLockProblemDemo.zip
最佳答案
在我看来,真正的问题是使用 WebBrowser
控件来托管 Adobe Reader 网络浏览器插件来显示 PDF。有没有更好的方法可以直接显示 PDF 而无需引入对网络浏览器的依赖? Adobe 不提供可以直接在表单中托管的 SDK 或 ActiveX 控件吗?
更新:我环顾四周,发现 this post他们访问 Adobe ActiveX 控件 (AxAcroPDFLib.AxAcroPDF
) 并简单地调用:
axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();
关于c# - 在 WinForms 中托管 IE 8 并打开 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809442/