将 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的主要内容,如果未能解决你的问题,请参考以下文章