【问题标题】:"File does not begin with '%PDF-'." Error when trying to load a PDF - ASP.NET MVC“文件不以 '%PDF-' 开头。”尝试加载 PDF 时出错 - ASP.NET MVC
【发布时间】: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&lt;MemoryStream&gt;。

我的 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


【解决方案1】:

删除线

baos.Position = 0;

或者至少将它移到using(PdfDocument...) {...} 块之后。

关闭合并或基础文档时,仍有一些数据写入输出流,通过在关闭前更改流位置,您可以使这些数据覆盖输出的开头(%PDF-... 标头所在的位置)而不是在末尾追加。

【讨论】:

  • 天哪,它成功了。太感谢了。我正用头撞墙,试图找出问题所在,哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多