acadia
acadia

Reputation: 2621

Create PDF in memory instead of physical file

How do one create PDF in memorystream instead of physical file using itextsharp.

The code below is creating actual pdf file.

Instead how can I create a byte[] and store it in the byte[] so that I can return it through a function

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

Upvotes: 38

Views: 98199

Answers (4)

Dennis Rongo
Dennis Rongo

Reputation: 4611

I've never used iTextPDF before but it sounded interesting so I took upon the challenge and did some research on my own. Here's how to stream the PDF document via memory.

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

Upvotes: 21

Mikael Svenson
Mikael Svenson

Reputation: 39695

Switch the filestream with a memorystream.

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

Upvotes: 37

Samuel Neff
Samuel Neff

Reputation: 74909

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

Upvotes: 26

Jon Skeet
Jon Skeet

Reputation: 1500375

Where your code has new FileStream, pass in a MemoryStream you've already created. (Don't just create it inline in the call to PdfWriter.GetInstance - you'll want to be able to refer to it later.)

Then call ToArray() on the MemoryStream when you've finished writing to it to get a byte[]:

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

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

I haven't used iTextSharp, but I suspect some of these types implement IDisposable - in which case you should be creating them in using statements too.

Upvotes: 8

Related Questions