【问题标题】:PDFsharp. Cannot handle iref streamsPDF 锐利。无法处理 iref 流
【发布时间】:2017-08-24 11:32:58
【问题描述】:

我们正在使用 PDFsharp 以编程方式对 PDF 文件进行一些更改。我们正在使用最新的稳定版本:1.32.4334。

http://www.pdfsharp.net/NuGetPackage_PDFsharp-MigraDoc-GDI.ashx?AspxAutoDetectCookieSupport=1

我尝试使用这样的 pdf 文件;

//inputStream is memory stream 
var doc = PdfReader.Open(inputStream); 

在某些文件上,我们在尝试打开上面代码中提到的 PDF 时遇到此错误;

无法处理 iref 流。 PDFsharp的当前实现 无法处理 Acrobat 6 引入的此 PDF 功能

我google了很多,看到很多人有这个问题,但我真的没有找到任何好的解决方案。来自网络的解决方案是:

1.

try
{
}
catch (PdfReaderException pdfException)
{
// Do nothing
}

2. 使用 PDFsharp 测试版 1.50。

第三种方法可能是将它与 iTextSharp 结合使用,但我已经体验到结合使用这两个库会出现问题。

我的问题是:try-catch 对我们不起作用,因为我们需要操作文件,并且在生产环境中使用 beta 版本可能不是一个好主意 - 特别是自从它一直处于 beta 版本时2015 年 12 月。

PDFsharp “死”了吗,因为它们已经在 1.50 版的测试版中使用了一年多?

还有什么我可以尝试的吗?

【问题讨论】:

  • 你解决过这个问题吗?
  • 是的。使用测试版。
  • 感谢您的回复。我最终自己使用了 iTextSharp。这两种解决方案都不是首选。

标签: c# pdf nuget open-source pdfsharp


【解决方案1】:

我发现问题(就我而言)特别适用于 PDF 文件,其中交叉引用 xref 表不是文件中的独立元素,因为它在 1.4 及之前的版本中,但已被提升根据规范的 1.5 版,/Type 等于 /XRef 的间接对象流。

PDFsharp 自己的 FQA 页面 http://www.pdfsharp.net/wiki/PDFsharpFAQ.ashx 是这样说的:

PDF 1.5 (Adobe Reader 6.0) 的某些功能尚未实现。因此 PDFsharp 还不能打开所有标记为 PDF 1.5 或更高版本的文件(但这在我们的路线图中)。

上述路线图“不是承诺”,在 2018 年 1 月 31 日仍表示:

支持 iref 流 - 最想要的功能:适用于某些文件,而其他文件仍然会导致问题

除了使用他们的测试版(我承认,我个人也不想在生产环境中这样做)之外,我看不到许多不涉及其他库的可用选项。为了保留和重用我所有现有的 PDFsharp 兼容代码,我的第一步(假设我不需要任何其他 1.5+ 功能)是尝试将文件下转换为早期版本格式,然后重新打开它在 PDFsharp 中:

PdfDocument doc;
try
{
    doc = PdfReader.Open(path);
}
catch (PdfReaderException e) when (e.Message == "Cannot handle iref streams. The current implementation of PDFsharp cannot handle this PDF feature introduced with Acrobat 6.")
{
    // TODO: try open path with another library
    // TODO: save path to temp file with version 1.4
    doc = PdfReader.Open(temp);
    // TODO: finally delete temp file
}

【讨论】:

  • “尝试将文件下转换为早期版本格式,然后在 PDFsharp 中重新打开” - 这当然不是处理数字签名 PDF 的选项,除非签名失效不是问题...
  • 这是一个有效的观点,但 OP 确实提到了操作文件的要求。我以前从未使用过数字签名的 PDF。假设没有下转换:单个文件是否可以在多个部分中进行签名,并且原始签名对更新的文件是否仍然有效(如果附加了更新并且不是由相同的证书签名)?
  • @Jono 今天更新了路线图和常见问题解答 - 感谢您的反馈。版本 1.50 beta 5 已经成熟、稳定,恕我直言,可以用于生产。它应该可以处理大多数带有 IREF 流的文件(路线图指的是 1.50 的早期 beta 版本,它不能处理带有 IREF 流的很多文件)。
  • @Jono “原始签名对更新的文件是否仍然有效(如果更新被附加并且不是由相同的证书签名)?” - 一组特定的更改允许对已签名文档进行增量更新。根据签名类型,这些可能包括特定的表格填写。
猜你喜欢
  • 2012-09-28
  • 1970-01-01
  • 2012-10-27
  • 2019-07-19
  • 1970-01-01
  • 2011-04-17
  • 2017-12-01
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多