положить сгенерированный PDF-файл, не сохраняя его на сервере - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть код (в .ashx-файле), который генерирует PDF-файл из PDF-шаблона.Сгенерированный PDF-файл персонализируется с именем и кодом.Я использую iTextSharp для этого.

Это код:

using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open))
    using (var newFileStream = new FileStream(fileNameNew, FileMode.Create))
    {
        var pdfReader = new PdfReader(existingFileStream);
        var stamper = new PdfStamper(pdfReader, newFileStream);

        var form = stamper.AcroFields;
        var fieldKeys = form.Fields.Keys;

        form.SetField("Name", name);
        form.SetField("Code", code);

        stamper.FormFlattening = true;

        stamper.Close();
        pdfReader.Close();
    }

context.Response.AppendHeader("content-disposition", "inline; filename=zenith_coupon.pdf");
context.Response.TransmitFile(fileNameNew);
context.Response.ContentType = "application/pdf";

Это работает, но сохраняет файл на сервере.Я не хочу этого делать, потому что будет много людей, загружающих файл PDF, и сервер будет заполнен в кратчайшие сроки.

Итак, мой вопрос, как я могу сгенерировать PDFс iTextSharp, не сохраняя его и не ставя его пользователю?

Ответы [ 2 ]

5 голосов
/ 09 ноября 2011

Вместо использования FileStream вы можете использовать MemoryStream, а затем использовать Response.Write() для вывода содержимого потока.

4 голосов
/ 09 ноября 2011

Вы можете использовать любой поток (например, MemoryStream) для промежуточного PDF (в вашем коде с именем newFileStream), если вы не хотите сохранять его в виде файла - пример кода см. http://www.developerfusion.com/code/6623/dynamically-generating-pdfs-in-net/ и http://forums.asp.net/t/1093198.aspx/1.

Просто не забудьте перемотать (т.е. установить Position = 0) MemoryStream перед передачей его клиенту (например, Response.Write или CopyTo (Response.OutputStream)) ...

...