从 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 控件获取 XML (RAW/SOURCE)
WebBrowser.DrawToBitmap() 还是其他方法?