【发布时间】:2023-03-28 04:22:02
【问题描述】:
我有多个 MemoryStreams 形式的 PDF,我需要将 MemoryStreams 合并为一个长 PDF 并将它们发送到浏览器。
我使用 iText7 创建了以下函数,该函数采用假定为 PDF 的 MemoryStreams 列表,输出是串联 PDF 的 MemoryStreams
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 上。
【问题讨论】:
-
仅仅因为您可以在本地查看它并不意味着它是有效的,许多 PDF 查看器会很乐意打开无效文件来“帮助”用户。使用十六进制编辑器检查下载的文件是否确实以
%PDF-开头。 -
“我能够将 PDF 保存在本地” - 你能分享该文件以供分析吗?
-
我是通过 IE 浏览器通过 file:///Path/To/App/App_Data/application.pdf 而非 PDF 查看器查看的。
-
@jordansandberg 让 IE 成为您的 PDF 查看器。如果您使用应用程序查看 PDF,则该应用程序就是您的查看器。伊恩的观点仍然存在。
-
@Amy 我明白了,谢谢。我查看了 PDF,它不是以“%PDF-”开头的。我不明白如何使用 iText 库生成可在浏览器中使用的 PDF。我生成 PDF 的功能有问题吗?
标签: c# asp.net-mvc pdf itext