Создание PDF в памяти вместо физического файла
Как создать PDF в memorystream вместо физического файла с помощью itextsharp.
Приведенный ниже код создает фактический pdf-файл.
Вместо этого, как я могу создать байт[] и сохранить его в байте [], чтобы я мог вернуть его через функцию
using iTextSharp.text;
using iTextSharp.text.pdf;
Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);
PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream("c:\Test11.pdf", FileMode.Create));
doc.Open();//Open Document to write
Paragraph paragraph = new Paragraph("This is my first line using Paragraph.");
Phrase pharse = new Phrase("This is my second line using Pharse.");
Chunk chunk = new Chunk(" This is my third line using Chunk.");
doc.Add(paragraph);
doc.Add(pharse);
doc.Add(chunk);
doc.Close(); //Close document
4 ответа:
Переключите поток файлов с потоком памяти.
MemoryStream memStream = new MemoryStream(); PdfWriter wri = PdfWriter.GetInstance(doc, memStream); ... return memStream.ToArray();
using iTextSharp.text; using iTextSharp.text.pdf; Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35); byte[] pdfBytes; using(var mem = new MemoryStream()) { using(PdfWriter wri = PdfWriter.GetInstance(doc, mem)) { doc.Open();//Open Document to write Paragraph paragraph = new Paragraph("This is my first line using Paragraph."); Phrase pharse = new Phrase("This is my second line using Pharse."); Chunk chunk = new Chunk(" This is my third line using Chunk."); doc.Add(paragraph); doc.Add(pharse); doc.Add(chunk); } pdfBytes = mem.ToArray(); }
Я никогда не использовал iTextPDF раньше, но это звучало интересно, поэтому я принял вызов и провел некоторые исследования самостоятельно. Вот как потоковая передача PDF-документа через память.
protected void Page_Load(object sender, EventArgs e) { ShowPdf(CreatePDF2()); } private byte[] CreatePDF2() { Document doc = new Document(PageSize.LETTER, 50, 50, 50, 50); using (MemoryStream output = new MemoryStream()) { PdfWriter wri = PdfWriter.GetInstance(doc, output); doc.Open(); Paragraph header = new Paragraph("My Document") {Alignment = Element.ALIGN_CENTER}; Paragraph paragraph = new Paragraph("Testing the iText pdf."); Phrase phrase = new Phrase("This is a phrase but testing some formatting also. \nNew line here."); Chunk chunk = new Chunk("This is a chunk."); doc.Add(header); doc.Add(paragraph); doc.Add(phrase); doc.Add(chunk); doc.Close(); return output.ToArray(); } } private void ShowPdf(byte[] strS) { Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "application/pdf"; Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now); Response.BinaryWrite(strS); Response.End(); Response.Flush(); Response.Clear(); }
Где ваш код имеет
new FileStream
, передайте вMemoryStream
, который вы уже создали. (Не просто создайте его встроенным в вызовPdfWriter.GetInstance
- вы захотите иметь возможность ссылаться на него позже.)Тогда звоните
ToArray()
наMemoryStream
Когда вы закончите писать к нему, чтобы получитьbyte[]
:using (MemoryStream output = new MemoryStream()) { PdfWriter wri = PdfWriter.GetInstance(doc, output); // Write to document // ... return output.ToArray(); }
Я не использовал iTextSharp, но я подозреваю, что некоторые из этих типов реализуют
IDisposable
- в этом случае вы должны создавать их вusing
операторах тоже.