6

我们有一个承载 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

4

4 回答 4

1

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

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

希望这可以帮助。

于 2009-05-12T15:17:50.907 回答
1

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


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

axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();
于 2009-05-26T15:00:45.520 回答
1

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

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

所以,这就是你要做的。

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

  2. 您需要将网络浏览器设置为另一个 pdf 文件,
    (我创建了一个空白文件 - 黑色或白色;任何适合您的文件)。
    所以喜欢webbrowser1.navigate("blank.pdf" )

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

  4. 现在,这是诀窍。在您退出此事件之前,不会释放资源。
    因此,您需要关注会导致另一个事件被触发的其他事情。
    就我而言,我使用树视图来查看 pdf。
    因此,在使用上述方法将文件标记为删除后,
    我会将树视图设置为不同的文件。
    所以在这个TreeView1_BeforeSelect方法中,我做了很明显的事情:

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


    你可以采用你自己的事件,但我确信在为删除做标记之后,你可以找到一些会导致另一个事件触发的事情。只需按照您的代码流程,接下来会发生什么。



所以你有它。希望这对某人有所帮助。

于 2011-11-25T15:48:59.590 回答
0

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

总之,我们并没有解决文件锁定问题,而是我们只是保留了文件句柄并重复使用文件,直到用户关闭应用程序。

希望这可以帮助。

于 2009-05-21T12:27:09.307 回答