将iTextSharp文档加载到MemoryStream中

时间:2013-04-02 19:45:24

标签: c# asp.net itextsharp

我正在开发一个ASP.NET应用程序,我必须根据在电子邮件上作为附件在页面上创建的表格发送PDF。所以我有一个函数将PDF创建为iTextSharp Document并返回它。如果我只是想保存这个文件,它工作正常,但我正在努力将其作为Stream。我已经尝试了几件事,但我总是陷入困境。

我尝试将其序列化,但似乎Document不可序列化。然后我尝试使用PdfCopy,但我无法找到如何将此问题用于特定的问题。

现在的代码是这样的:

//Table,string,string,Stream
//This document returns fine
Document document = Utils.GeneratePDF(table, lastBook, lastDate, Response.OutputStream);

using (MemoryStream ms = new MemoryStream())
{
    PdfCopy copy = new PdfCopy(document, ms);
    //Need something here to copy from one to another! OR to make document as Stream      
    ms.Position = 0;
    //Email, Subject, Stream
    Utils.SendMail(email, lastBook + " - " + lastDate, ms);
}

2 个答案:

答案 0 :(得分:3)

尽量避免传递原生的iTextSharp对象。传递流,文件或字节。我现在面前没有IDE,但你应该可以这样做:

byte[] Bytes;
using(MemoryStream ms = new MemoryStream()){
    Utils.GeneratePDF(table, lastBook, lastDate, ms);
    Bytes = ms.ToArray();
}

然后,您可以将Utils.SendMail()更改为接受字节数组或仅wrap it in another stream

修改

可能也可以在您的代码中执行以下操作:

using(MemoryStream ms = new MemoryStream()){
    Utils.GeneratePDF(table, lastBook, lastDate, ms);
    ms.Position = 0;
    Utils.SendMail(email, lastBook + " - " + lastDate, ms);
}

答案 1 :(得分:2)

我过去通过执行以下操作来做到这一点:

        using (Document doc = new Document())
        {
            MemoryStream msPDFData = new MemoryStream();
            PdfWriter writer = PdfWriter.GetInstance(doc, msPDFData);
            doc.Open();
            doc.Add(new Paragraph("I'm a pdf!");
        }

如果您还需要访问原始数据,也可以

byte[] pdfData = msPDFData.ToArray();