我正在尝试使用iTextSharp在MVC中创建一个pdf文件。我确实有一个简单的用例。文件正在创建但是当我打开PDF时出现错误文件已损坏无法打开文件。有什么想法/帮助吗?
我的控制器代码如下
public FileStreamResult GetPdfMemory()
{
iTextSharp.text.Document doc = new iTextSharp.text.Document();
MemoryStream mem = new MemoryStream();
PdfWriter pdfWriter = PdfWriter.GetInstance(doc, mem);
//pdfWriter.CloseStream = false;
doc.Open();
doc.Add(new Paragraph("Charts"));
mem.Position = 0;
FileStreamResult fileStreamResult = new FileStreamResult(mem, System.Net.Mime.MediaTypeNames.Application.Pdf)
{
FileDownloadName = "chart_" + ".PDF"
};
return fileStreamResult;
}
查看: @ Html.ActionLink(“Pdf Memory”,“GetPdfMemory”,“Home”,null,new {id =“download”})
仅供参考:当我尝试使用FileStream而不是MemoryStream时,一切正常。但我需要使用memorystream创建PDF。
答案 0 :(得分:0)
您操纵(mem.Position = 0
)并使用new FileStreamResult(mem, ...)
)MemoryStream
,然后发信号通知iTextSharp它可以完成文档。因此,根据Document
和PdfWriter
的隐式销毁或内存流中数据的使用是否先出现,您要么缺少PDF,要么关闭部分或关闭部分(正在写入)在重新定位内存流之后)覆盖数据的开始。
要通知iTextSharp它可以完成文档,请在操作内存流之前调用doc.Close()
,或者在Document
块中使用using
,例如:
using (MemoryStream ms = new MemoryStream()) {
// step 1
using (Document document = new Document()) {
// step 2
PdfWriter.GetInstance(document, ms);
// step 3
document.Open();
// step 4
document.Add(new Paragraph("HelloWorldMemory"));
}
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
}
(从[{3}}的样本HelloWorldMemory.cs无耻地复制)Webified iTextSharp Examples)
隐式使用using
会导致Document
关闭。