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