在WinForms中托管IE 8并打开PDF

时间:2009-04-30 22:31:28

标签: 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和Adobe Acrobat 8​​(或9)的组合会导致临时PDF文件上放置额外的文件锁定句柄。在整个应用程序关闭之前,额外的锁定句柄不会消失。我还要提一下,在Acrobat打开文件之前,文件上没有锁。

我们可以在多台机器上重现这一点,它始终是IE8和Adobe Acrobat Reader的结合。我们可以安装福昕阅读器3而不是Adobe Acrobat,一切正常。同样,我们可以在使用IE7和Adobe Acrobat的机器上运行应用程序,并且工作正常。但是,当你混合使用IE 8的魔法药水和Acrobat时,你最终会陷入混乱。

任何人都可以告诉我为什么我会得到一个额外的文件锁定,直到应用程序结束为止?

感谢。

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

4 个答案:

答案 0 :(得分:1)

仍未找到解决方案,但更多信息: 以前我用XP Pro,Acrobat * .x和.NET 2.0(用VS 2005构建)测试过。从那时起,我还在各种场景中进行了测试,包括Vista,Acrobat 9.x和.NET 3.5(使用VS 2008构建)。

但结果相同:只要浏览器是IE8,当您在WebBrowser控件上调用Dispose()时,PDF文件就不会被释放。它会在应用关闭时释放,但这对我们没有帮助......

希望这有帮助。

答案 1 :(得分:1)

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


更新:我环顾四周,发现this post他们访问了Adobe ActiveX控件(AxAcroPDFLib.AxAcroPDF),只需致电:

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

答案 2 :(得分:1)

我的答案不需要任何临时文件。

在我不想重写我的所有代码以使用临时文件之后,我被迫创建了一个解决方案。

所以,这就是你做的。

  1. 创建一个字符串列表以保存要删除的文件
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. 您需要将webbrowser设置为另一个pdf文件,
    (我创建了一个空白的 - 黑色或白色;适用于您的任何内容)。
    所以像webbrowser1.navigate("blank.pdf" )

  3. 一样
  4. 将要删除的文件添加到字符串列表中。所以filesToDelete.Add(filename)

  5. 现在,这就是诀窍。在您离开此活动之前,资源不会被释放。
    因此,你需要专注于会导致另一个事件被触发的其他事情。
    在我的情况下,我使用树视图来查看pdf。
    因此,在使用上述方法标记要删除的文件之后,我将树视图设置为不同的文件。
    所以在TreeView1_BeforeSelect方法中,我做了显而易见的事:

    If filesToDelete.Count > 0 Then
          For Each f As String In filesToDelete
              File.Delete(f)
          Next
        filesToDelete.Clear()
      End If


    您可以采用自己的事件,但我确定在删除标记后,您可以找到要执行的操作,这将导致另一个事件触发。只需按照代码流程,接下来会发生什么。


  6. 所以你有它。希望这有助于某人。

答案 3 :(得分:0)

我们在IE8和Acrobat方面遇到了同样的问题。在我们的例子中,我们只需要能够覆盖临时PDF并重新显示它。我们发现我们可以简单地打开PDF,写入0字节然后关闭。之后,我们将打开文件并编写新的PDF信息,然后重新显示临时文件。

总之,我们没有解决文件锁定问题,而是只是将文件句柄附加并重新使用该文件,直到用户关闭应用程序。

希望这有帮助。