从 webbrowser 控件保存 pdf 文档

Posted

技术标签:

【中文标题】从 webbrowser 控件保存 pdf 文档【英文标题】:Saving pdf document from webbrowser control 【发布时间】:2013-05-09 18:17:58 【问题描述】:

我正在从 webbrowser 控件导航到这样的 url; http://www.who.int/cancer/modules/Team%20building.pdf

它显示在网络浏览器控件中。我想要做的是把这个pdf文件下载到电脑上。但是我尝试了很多方法;

Dim filepath As String
filepath = "D:\temp1.pdf"
Dim client As WebClient = New WebClient()
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadFileAsync(WebBrowserEx1.Url, filepath)

这个下载了一个pdf,但文件中没有任何内容。

也试过

objWebClient.DownloadFile()

什么都没有改变。

我试图显示一个保存或打印对话框;

WebBrowserEx1.ShowSaveAsDialog()
WebBrowserEx1.ShowPrintDialog()

但他们没有显示任何对话框。也许最后一个是因为它没有等待将pdf完全加载到webbrowser中。

当我尝试 html 文件时,下载没有问题,但是在这个 .pdf 文件中,我想我没有设法等待文件以 pdf 格式加载到浏览器中。这个函数;

 Private Sub WaitForPageLoad(ByVal adimno As String)
    If adimno = "1" Then
        AddHandler WebBrowserEx1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
        While Not pageReady
            Application.DoEvents()
        End While
        pageReady = False
    End If

End Sub

Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    If WebBrowserEx1.ReadyState = WebBrowserReadyState.Complete Then
        pageReady = True
        RemoveHandler WebBrowserEx1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    End If
End Sub

不适用于这种情况。我的意思是它进入无限循环。

所以任何人都知道如何等待它加载 pdf 然后保存到计算机中。

【问题讨论】:

【参考方案1】:

您可以在文档完成触发时测试 URL,如果它是 .pdf,然后执行以下操作,然后返回,例如。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    WebBrowserEx1.Navigate("http://www.who.int/cancer/modules/Team%20building.pdf")
End Sub

Private Sub WebBrowserEx1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowserEx1.DocumentCompleted

    If WebBrowserEx1.Url.ToString.Contains(".pdf") Then

        Using webClient = New WebClient()
            Dim bytes = webClient.DownloadData(WebBrowserEx1.Url.ToString) 'again variable here

            File.WriteAllBytes(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TEST.pdf"), bytes) 'save to desktop or specialfolder. to list all the readily available user folders
        End Using

 'WebBrowserEx1.goback() 'could send browser back a page as well

    End If



End Sub

您需要将文件名“TEST”作为变量而不是静态字符串,否则每次都会覆盖同一个文件。也许:

 WebBrowserEx1.DocumentTitle.ToString & ".pdf"

而是将文件保存为以网页标题命名的 pdf。唯一的问题是,如果页面包含非法字符(windows 不允许您保存),它将引发异常以便处理。

【讨论】:

谢谢,但它只触发一次 DocumentCompleted 事件,并且当时没有完成。所以,仍然保存了 0 字节的 pdf。 @Mtok 文档完成只会触发一次(如果有网络框架等则更多),无论是否在 WBC 中加载了 pdf,它所寻找的只是以结尾的 URL .pdf 传递给 webclient 的新实例,该实例采用 url 并从该 url 作为字节下载。您尝试在互联网上下载的页面吗?这适用于您为我提供的示例。 网址不是那个,我展示了该网址以显示 pdf 的打开方式。在某些页面进入(通过脚本)动态创建的pdf之后,我正在登录网站(通过webbrowser),最后我得到了类似的url; uyg.sgk.gov.tr/EBorcuYoktur5510/…所以我需要下载已经在网络浏览器中的pdf,而不是通过url。 @Mtok 我唯一能想到的就是更改 IE 处理 PDF MIME 类型的方式,然后尝试在 WBC 文件下载事件中捕获文件。请参阅:***.com/questions/2459273/…“因为 IE 在用户的客户端计算机上嵌入了为 pdf 文件类型注册的任何程序,所以没有标准的方式可以访问该文档。”我的猜测:这是有道理的,因为尝试流式传输/读取文档没有返回任何内容,这意味着 WBC 并没有真正处理 pdf,adobe 是

以上是关于从 webbrowser 控件保存 pdf 文档的主要内容,如果未能解决你的问题,请参考以下文章

WebBrowser 控件不呈现某些页面

如何从 WebBrowser 控件获取 XML (RAW/SOURCE)

WebBrowser.DrawToBitmap() 还是其他方法?

抑制 WebBrowser 控件中的保存/打开对话框

在 WebBrowser 的文档中从 JavaScript 调用 C# 代码

如何创建和填写 PDF 表单