在 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()
在它之前。但我不确定这不会使问题变得更糟,而且我很难进行测试(因为一旦你下载了一次文件,就不会再次抛出错误)。
这能解决问题吗?我在标题中有什么问题吗?或者我应该对 Response / PdfStamper 对象做些什么?