在内存中创建PDF而不是物理文件

aca*_*dia 35 c# itextsharp

如何使用itextsharp在内存流而不是物理文件中创建PDF.

下面的代码是创建实际的pdf文件.

相反,我如何创建一个byte []并将其存储在byte []中,以便我可以通过函数返回它

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
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 34

使用内存流切换文件流.

MemoryStream memStream = new MemoryStream();
PdfWriter wri = PdfWriter.GetInstance(doc, memStream);
...
return memStream.ToArray();
Run Code Online (Sandbox Code Playgroud)


Sam*_*eff 22

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();
}
Run Code Online (Sandbox Code Playgroud)

  • @musefan,是的,5.0.5就是这样.在当前版本5.5中,`PdfWriter`扩展了`DocWriter`,它实现了`IDocListener`,扩展了`IDisposable`.我不知道'IDisLablener`被添加到`IDocListener`的确切时间,但它在5.0.5之后和5.5.0之前已经过了一段时间. (4认同)

Den*_*ngo 20

我之前从未使用过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();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 8

您的代码所在的位置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();
}
Run Code Online (Sandbox Code Playgroud)

我没有使用过iTextSharp,但我怀疑其中有些类型是实现的IDisposable- 在这种情况下你也应该在using语句中创建它们.