在ASP.NET应用程序中,我使用iTextSharp(大多数是PDFFamper)来填充PDF上的一些内容并将其发送给用户。下面的代码是一个onclick事件里面:Adobe 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对象?
为什么要这样做?它的工作原理是什么? – tHeSiD
我已经更新了我可以记住或挖掘的帖子。 –