В приложении ASP.NET я использую iTextSharp (в основном PdfStamper) для заполнения некоторого содержимого в формате PDF и отправки его пользователю. Следующий код в событие OnClick:Выход Response.Stream (PDF), потерянный Adobe Reader
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
Я обновил сообщение тем, что мог запомнить или выкопать. –