我具有MemoryStreams形式的多个PDF,并且需要合并MemoryStreams,以便它们是一个较长的PDF,并将其发送到浏览器。
我使用iText7创建了以下函数,该函数采用了假定为PDF的MemoryStreams列表,并且输出为串联的PDF的MemoryStream。
public static MemoryStream PdfCat(List<MemoryStream> pdfs)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
using(PdfDocument applicationPdf = new PdfDocument(new PdfWriter(baos)))
{
PdfMerger merger = new PdfMerger(applicationPdf);
// add every document to the empty pdf
foreach (MemoryStream pdfMemStream in pdfs)
{
using (PdfDocument pdf = new PdfDocument(new PdfReader(pdfMemStream)))
{
merger.Merge(pdf, 1, pdf.GetNumberOfPages());
}
}
baos.Position = 0;
merger.Close();
}
return new MemoryStream(baos.ToArray());
}
我正在尝试使用以下命令将PDF发送到控制器中的浏览器:
MemoryStream application = FileUtils.PdfCat(applicationPdfs);
return new FileStreamResult(application, "application/pdf");
哪里applicationPdfs
是List<MemoryStream>
。
HTML中的按钮如下所示:
<a href="~/Report/Index/@Model.id" target="_blank">View all attachments</a>
问题是,当我单击“查看所有附件”按钮时,在浏览器中出现以下错误:
我能够将PDF保存在本地并以这种方式查看,因此PDF可以正确合并。有谁知道该错误的含义以及如何解决该错误?
更新:看来这仅在我使用FireFox作为浏览器时才有效。由于某些原因,该错误仅在IE和Chrome中发生。
删除线
baos.Position = 0;
或至少将其移动到using(PdfDocument...) {...}
方块后面。
关闭合并或基础文档时,仍有一些数据写入输出流,并且通过在关闭前更改流的位置,可以使这些数据覆盖输出的开头(%PDF-...
标头所在的位置),而不是附加到输出端。结束。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句