В приложении 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?