2010-05-12 30 views
29

¿Cómo se puede crear PDF en el flujo de memoria en lugar de archivo físico utilizando itextsharp.Crear PDF en memoria en lugar de archivo físico

El siguiente código está creando un archivo pdf real.

lugar, ¿cómo puedo crear un byte [] y almacenarlo en el byte [] para que pueda regresar a través de una función

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 

Respuesta

25

Cambie el filestream con un flujo de memoria.

MemoryStream memStream = new MemoryStream(); 
PdfWriter wri = PdfWriter.GetInstance(doc, memStream); 
... 
return memStream.ToArray(); 
7

Cuando el código tiene new FileStream, pasar en un MemoryStream tienes ya creado. (No se limite a crearlo en línea en la llamada a PdfWriter.GetInstance - usted quiere ser capaz de hacer referencia a ella más tarde.)

luego llamar a ToArray() en el MemoryStream cuando haya terminado de escribir en él para obtener una byte[] :

using (MemoryStream output = new MemoryStream()) 
{ 
    PdfWriter wri = PdfWriter.GetInstance(doc, output); 

    // Write to document 
    // ... 
    return output.ToArray(); 
} 

no he utilizado iTextSharp, pero sospechar que algunos de estos tipos de implemento IDisposable - en cuyo caso debe ser la creación de ellos en using declaraciones también.

20
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(); 
} 
+0

PdfWriter no implementa IDisposable por lo que no puede usarlo en una instrucción de uso. Tal vez esto solo esté en la versión que estoy usando (5.0.5) ya que sé que ha habido algunos cambios de clase de la versión 4 – musefan

+3

@musefan, sí, en 5.0.5 ese es el caso. En la versión actual, 5.5, 'PdfWriter' extiende' DocWriter' que implementa 'IDocListener' que extiende' IDisposable'. No sé exactamente cuándo se agregó 'IDisposable' a' IDocListener' pero fue algo después de 5.0.5 y antes de 5.5.0. –

14

nunca he utilizado antes iTextPDF pero sonaba interesante así que tomaron sobre el reto e hicieron algunas investigaciones por mi cuenta. A continuación, le mostramos cómo transmitir el documento PDF a través de la memoria.

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(); 
} 
Cuestiones relacionadas