2012-03-29 343 views
1

我正在用C#编写一个网页抓取程序。到目前为止,我已经能够登录到网站,保存cookie,并返回另一页的源代码。从这个源代码中,我得到一个链接,将我带到pdf中,但该页面不以.pdf扩展名结尾。在浏览器中,此页面显示pdf图像,浏览器中包含一个保存按钮。如何保存/下载pdf嵌入在网页中没有pdf文件名

我相信PDF页面是使用ColdFusion创建的,因为它在URL中具有.cfm,CFID和CFTOKEN。

如何以编程方式保存此PDF文件?

两个答案建议我将二进制流保存为pdf。我如何首先获取二进制数据?我曾尝试以下:

 byte[] result; 
     byte[] buffer = new byte[4096]; 

     WebRequest wr = WebRequest.Create(billURL); 

     using (WebResponse response = wr.GetResponse()) 
     { 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       using (MemoryStream memoryStream = new MemoryStream()) 
       { 
        int count = 0; 
        do 
        { 
         count = responseStream.Read(buffer, 0, buffer.Length); 
         memoryStream.Write(buffer, 0, count); 

        } while (count != 0); 

        result = memoryStream.ToArray(); 
       } 
      } 
     } 

不那么我想结果保存为PDF,还是我做错了什么呢?

+0

如果你不显示链接/按钮/无论如何它不可能帮助pyou。 – JotaBe 2012-03-29 22:14:14

+0

由于该页面在登录后面,我无法真正显示直接示例。但这是一个水电费账单,在看过很多公用事业供应商的网站之后,似乎大多数人都以这种方式显示他们的账单PDF。也许检查你自己的水电费账单在网上找到一个例子? – 2012-03-29 22:30:01

+0

http://support.microsoft.com/kb/307023? – Henry 2012-03-29 22:56:02

回答

1

在CF的流式PDF浏览器的常用方法是使用这种方法:

<cfheader name="Content-Disposition" value="attachment;filename=#PDFFileName#"> 
<cfcontent type="application/pdf" reset="true" variable="#toBinary(PDFinMemory)#"> 

使用C#的WebRequest来获取PDF的URL。然后检查“应用程序/ pdf的内容类型”的响应头。如果是这样,将二进制流保存到磁盘上的PDF文件。

+0

我该如何获得二进制流?我会发布我在原始问题中尝试的内容。 – 2012-03-30 18:24:04

+0

@ BenWalker-假设你有正确的URL,.cfm页面将返回一个二进制流。只需从响应中捕获字节(就像上面所做的那样)并将'result'保存到文件中。文件名可以从[WebResponse头文件](http://msdn.microsoft.com/en-us/library/system.net.webresponse.headers.aspx)中获取。此外,你可以查看其他SO线程的完整示例,例如这个[下载文件时获取文件名](http://stackoverflow.com/questions/4096929/get-filename-while-downloading-it)。 – Leigh 2012-04-01 15:47:43

1

假设CFID和CFTOKEN是不是真的需要,(你可以测试URL没有CFID和CFTOKEN,看看你是否仍然可以获取的PDF成功)

  1. 使用WebRequest做一个GET请求该URL(请参阅:http://support.microsoft.com/kb/307023

  2. 将二进制流保存为PDF文件。

+0

当我切出CFID和CFTOKEN时,它会重定向回到包含它们的页面。 – 2012-03-30 15:20:29

1

我得到一个链接,带我到一个PDF格式,但页面不 .pdf扩展名结尾.. 我如何在首位的二进制数据?

除了其他的建议,一个小的澄清。文件扩展名并不重要。重要的是内容。 .cfm脚本可以返回任何content-type,而不仅仅是text/html。所以它可以模仿PDF,图像等等。只要你的链接返回类型application/pdf你应该得到一个二进制流(即PDF),你可以保存到一个文件。原始文件名可以从WebResponse headers获得。