【发布时间】:2010-02-24 17:57:56
【问题描述】:
在 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 对象做些什么?
【问题讨论】:
标签: c# itextsharp response outputstream