加载一个iTextSharp文档到MemoryStream

本文关键字:iTextSharp 文档 MemoryStream 一个 加载 | 更新日期: 2023-09-27 18:07:11

我正在开发一个ASP。. NET应用程序,我必须发送基于在页面上动态创建的表作为电子邮件附件的PDF。我有一个函数创建PDF作为iTextSharp文档并返回它。如果我试着保存这个文档,它工作得很好,但我有一个糟糕的时间试图把它作为流。我已经尝试过好几种方法了,但是我总是在某一点上卡住了。

我试图序列化它,但似乎文档是不可序列化的。然后我试着用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);
}

加载一个iTextSharp文档到MemoryStream

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

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

然后你可以改变你的Utils.SendMail()接受字节数组或只是包装它在另一个流。

编辑

可能也可以在你的代码中做这样的事情:

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

我以前这样做过:

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