关于C#:将ITextSharp文档加载到MemoryStream

Loading an iTextSharp Document into MemoryStream

我正在开发一个ASP.NET应用程序,在该应用程序中,我必须发送一个基于页面上常规创建的表作为电子邮件附件的PDF。所以我有一个函数,创建PDF作为ITextSharp文档并返回它。如果我试图保存此文档,它会正常工作,但我尝试将其转换为流时遇到了困难。我已经试过几次了,但总有一天我会被卡住。

我试图将其序列化,但文档似乎不可序列化。然后我尝试使用pdfcopy,但我找不到如何将其具体用于我的问题。

现在的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
//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);
}


尽量避免传递本地ITextSharp对象。传递流、文件或字节。我现在没有一个IDE,但是你应该可以这样做:

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

然后,您可以更改Utils.SendMail()以接受字节数组,或者将其包装在另一个流中。

编辑

您也可以在代码中这样做:

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


我过去做过这样的事情:

1
2
3
4
5
6
7
        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!");
        }

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

1
byte[] pdfData = msPDFData.ToArray();