在ASP.NET应用程序中,我使用iTextSharp(主要是PdfStamper)来填充PDF上的一些内容并将其发送给用户 . 以下代码位于OnClick事件中:
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() . 但我不会让问题变得更糟,而且我已经下载了一次文件,错误不再被抛出了 .
可能解决问题吗?我在 Headers 中有什么问题吗?或者我还应该对Response / PdfStamper对象做些什么呢?