2010-02-24 83 views
0

在ASP.NET应用程序中,我使用iTextSharp(大多数是PDFFamper)来填充PDF上的一些内容并将其发送给用户。下面的代码是一个onclick事件里面:Adob​​e Reader丢失了Response.Stream输出(PDF)

PdfReader r = new PdfReader(
    new RandomAccessFileOrArray(Request.MapPath(compatiblePdf)), null 
); 

ps = new PdfStamper(r, Response.OutputStream); 
AcroFields af = ps.AcroFields; 

af.SetField("ContactInfo[0]", o.mallName); 
af.SetField("ClientName", string.Format("{0} {1}", c.firstName, c.lastName)); 
af.SetField("ClientEmail", c.emailAddress); 
ps.FormFlattening = true; 
Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", "attachment; filename=Form.pdf"); 
ps.Close(); 
Response.End(); 

所以,基本上,PdfReader获取文件,PdfStamper采取PdfReader作为参数,并将推动其成品的PDF Response.OutputStream。

问题是,使用IE和Adobe Reader时,如果从文件对话框中选择“打开”,Adobe Reader会抛出一个错误,指出“无法找到文件”。用户可以很好地“保存”文件,甚至再次开始下载(当被问到时再次点击“打开”)似乎工作。但是,在一台从未下载过该文件的新机器上,Adobe Reader似乎将文件放置在临时文件或任何IE上。

我现在只能想象一件事:Response.End(),或许应该是Response.Close(),或者也许整个事情在它之前应该有Response.Flush()。但我不确定这不会使问题变得更糟,而且我也很难进行测试(因为一旦您下载了文件一次,错误就不会再次抛出)。

可以解决这个问题吗?标题中是否有错误?还是有什么我应该做的与Response/PdfStamper对象?

回答

5

每当我强迫内容的用户,我按照这一套为响应步骤:

Response.Clear() 
Response.ClearHeaders() 
Response.Buffer = True 
Response.ContentType = "your mime type" 
Response.CacheControl = "public" 
Response.AddHeader("Pragma", "public") 
Response.AddHeader("Expires", "0") 
Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0") 
Response.AddHeader("Content-Description", "Description of your content") 
Response.AddHeader("Content-Disposition", "attachment; filename=""somefile.pdf""") 

' Add your content to the buffer here 

Response.Flush() 
Response.End() 

这似乎是在阻止所有的“未找到文件”垃圾还不错。

编辑:对于那些有兴趣在什么这些标题实际上意味着:

  1. Pragma: public有助于控制缓存与HTTP/1.0请求的向后兼容性。它确保您的请求将其发送到服务器,即使已经有缓存响应。
  2. Expires: 0是响应过期后的时间间隔(以秒为单位)。设置为0会立即过期响应,有助于避免过时的缓存。
  3. Cache-control: must-revalidate告诉缓存它必须遵守你的每个命令(即当你要求时它必须给你一个新的响应)。
  4. Cache-control: post-check=0, pre-check=0:这是以秒为单位的时间间隔,必须检查响应是否在(分别)为内容提供服务之后/之前进行更新。设置为0会强制立即检查响应的新鲜度。 (More at MSDN。)
  5. 其余部分仅描述您希望用户接收的内容。指定“附件”会告诉浏览器提供该文件作为下载内容,而不是以内联方式显示。
+0

为什么要这样做?它的工作原理是什么? – tHeSiD

+0

我已经更新了我可以记住或挖掘的帖子。 –

相关问题