如何在没有pdf文件名的情况下保存/下载嵌入网页的pdf文件
本文关键字:pdf 下载 文件 网页 保存 情况下 文件名 | 更新日期: 2023-09-27 18:29:32
我正在用C#编写一个web抓取程序。到目前为止,我已经能够登录网站,保存cookie,并返回另一个页面的源代码。从这个源代码中,我得到了一个指向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,还是我在那里做错了什么?
CF中将PDF流式传输到浏览器的常用方法是使用以下方法:
<cfheader name="Content-Disposition" value="attachment;filename=#PDFFileName#">
<cfcontent type="application/pdf" reset="true" variable="#toBinary(PDFinMemory)#">
使用C#WebRequest获取PDf的URL。然后检查响应标头中的"内容类型"application/pdf'。如果是,请将二进制流保存到磁盘上的PDF文件中。
假设CFID和CFTOKEN不是真正需要的,(你可以在没有CFID和CF TOKEN的情况下测试URL,看看你是否仍然可以成功获取PDF)
-
使用
WebRequest
向该URL发出GET请求(请参阅:http://support.microsoft.com/kb/307023) -
将二进制流保存为PDF文件。
我得到了一个链接,可以链接到pdf,但页面没有以.pdf扩展名。。首先我如何获得二进制数据?
除了其他建议之外,还有一个小的澄清。文件扩展名其实并不重要。重要的是内容。.cfm脚本可以返回任何内容类型,而不仅仅是text/html
。所以它可以模仿pdf、图像等。只要你的链接返回类型application/pdf
,你就应该返回一个可以保存到文件中的二进制流(即pdf)。原始文件名可以从WebResponse标头中获取。