将 iTextSharp 文档加载到 MemoryStream

Posted

技术标签:

【中文标题】将 iTextSharp 文档加载到 MemoryStream【英文标题】:Loading an iTextSharp Document into MemoryStream 【发布时间】:2013-03-24 06:32:49 【问题描述】:

我正在开发一个 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);

【问题讨论】:

根据您的 iTextSharp 版本,在 PDF 完全创建后会自动关闭流。 PdfWriter 和派生类(例如PdfCopy)有一个属性来阻止这种情况。您可能需要切换此属性。 【参考方案1】:

尽量避免传递原生 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);

【讨论】:

感谢@ChrisHaas,工作就像一个魅力!我在第一次测试中尝试过这样的事情,但我不确定为什么这在那儿不起作用,一定是忘记了什么。再次感谢!【参考方案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();

【讨论】:

确保使用ToArray() 而不是GetBuffer() ***.com/a/6454435/231316 感谢您的回答!但是我在创建 PDF 时这样做,我想要一些可以通过发送电子邮件的方法重用文档的东西。 @ChrisHaas 的回答效果很好!

以上是关于将 iTextSharp 文档加载到 MemoryStream的主要内容,如果未能解决你的问题,请参考以下文章

使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档

ITextSharp HTML到PDF?

使用 iTextSharp 将多个页面添加到 pdf 表单

ITextSharp PdfCopy 使用示例

itextsharp 错误:“文档没有页面。”

iTextSharp 设置文档横向(横向)A4