【问题标题】:Saving pdf document from webbrowser control从 webbrowser 控件保存 pdf 文档
【发布时间】: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 然后保存到计算机中。

【问题讨论】:

    标签: vb.net webbrowser-control


    【解决方案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 文件下载事件中捕获文件。请参阅:stackoverflow.com/questions/2459273/…“因为 IE 在用户的客户端计算机上嵌入了为 pdf 文件类型注册的任何程序,所以没有标准的方式可以访问该文档。”我的猜测:这是有道理的,因为尝试流式传输/读取文档没有返回任何内容,这意味着 WBC 并没有真正处理 pdf,adobe 是
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 2012-05-14
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多