【问题标题】:iTextSharp-generated PDFs now cause Save dialog in Adobe Reader XiTextSharp 生成的 PDF 现在会在 Adob​​e Reader X 中显示“保存”对话框
【发布时间】:2012-10-31 04:37:48
【问题描述】:

我使用 iTextSharp 生成 PDF 文档已经一年多了。不幸的是,随着 Adob​​e Reader X 的发布,我的 PDF 现在会导致“您要保存吗?”关闭 PDF 文档时出现的对话框。不是使用 iTextSharp 生成的 PDF 不会发生这种情况。对于整天打开和关闭 PDF 文档的用户来说,这真的很烦人。我可以设置 iTextSharp 中的任何属性来防止这种情况发生吗?

如果有帮助,我正在使用 PdfReader 从现有 PDF 文档中读取数据(此原始文档不会导致“保存”对话框出现)。然后我使用 PdfWriter 创建一个新文档并使用 AddTemplate 将原始文档的一部分复制到新文档中。

【问题讨论】:

  • 其实我也注意到了这个问题,所以我很好奇你是否找到任何答案。
  • 有 2 个可能的原因:文档包含表单字段并且 AcroForm 对象的 NeedAppearances 标志设置为 true 或者 PDF 文件中存在错误,该错误在以前的 Adob​​e 版本中被忽略读者。如果您可以发布指向示例 PDF 文件的链接,我可以查看它并为您提供更多信息。

标签: pdf itextsharp adobe-reader


【解决方案1】:

问题出在这一行:

Response.OutputStream.Write(MS.GetBuffer(), 0, MS.GetBuffer().Length)

GetBuffer 方法返回大于实际内容的整个内部缓冲区。坏的 PDF 在末尾有大约 10kb 的垃圾内容(零字节),好的 PDF 只有几个垃圾字节。使用内存流的ToArray()方法获取PDF文件,问题就解决了。您还将获得更小的文件。

byte[] pdf = MS.ToArray();
Response.OutputStream.Write(pdf, 0, pdf.Length);

还将“Content-Length”设置为 pdf 数组的长度。

【讨论】:

  • 好吧,你解决了我的问题!谢谢@Sorin Nistor!我什至不确定我从哪里得到这个GetBuffer() 代码,我通常使用ToArray(),这就是为什么我最近才开始注意到这个问题。
  • 这也解决了我的问题!这很奇怪——我通常也使用 ToArray(),但我所有的 PDF 代码都使用了 GetBuffer()。看起来网络上的许多 iTextSharp 代码示例都使用 GetBuffer,所以我确定我只是复制了一些代码。希望这篇文章能帮助其他也开始注意到这个问题的人。 @Sorin Nistor - 非常感谢! @Chris Haas - 感谢您发布您的代码。
  • 我希望我能不止一次地支持这个答案。完全节省了我的时间和理智:)
  • 非常感谢。也解决了我的问题!
【解决方案2】:

同时添加

HttpContext.Current.Response.End();

完成您的 PDF 文件后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多