Избегайте сохранения нового файла на диске

Я использую ASP.NET 3.5 с iTextSharp, и у меня есть следующий код:

var templatePath = Server.MapPath(@"~/Templates/template1.pdf");
var newFilePath = Server.MapPath(@"~/TempFiles/new.pdf");

PdfReader pdfReader = new PdfReader(templatePath);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFilePath, FileMode.Create));
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfFormFields.SetField("Box1", "007");
pdfFormFields.SetField("Box2", "123456");
pdfStamper.FormFlattening = false;
pdfStamper.Close();
Response.ClearContent();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=new.pdf"));
Response.WriteFile(newFilePath);
Response.End();

Приведенный выше код заполняет файл PDF и сохраняет новый файл в папке TempFiles. Затем он предлагает пользователю сохранить или открыть файл. Могу ли я добиться той же функциональности, не сохраняя файл в папке TempFiles?


person Kumar    schedule 08.03.2010    source источник
comment
@Kumar: Вы приняли ответы только примерно на половину своих вопросов. Возможно, вы захотите проверить, достойны ли другие выбрать принятый ответ.   -  person Eric J.    schedule 08.03.2010


Ответы (1)


Да, вы можете писать прямо в выходной поток ответа. Я не использовал PdfStamper, но вот как я это делаю при создании новых PDF-файлов:

doc = new iTextSharp.text.Document(PageSize.A4);
writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, Response.OutputStream);
writer.SetFullCompression();
doc.Open();

Похоже, вы передаете поток в конструктор PdfStamper, поэтому должно работать следующее:

var templatePath = Server.MapPath(@"~/Templates/template1.pdf");

PdfReader pdfReader = new PdfReader(templatePath);
Response.ClearContent();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=new.pdf"));
PdfStamper pdfStamper = new PdfStamper(pdfReader, Response.OutputStream);
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfFormFields.SetField("Box1", "007");
pdfFormFields.SetField("Box2", "123456");
pdfStamper.FormFlattening = false;
pdfStamper.Close();
Response.End();
person T.J. Crowder    schedule 08.03.2010