如何修复 mupdf 中的 "cannot find ExtGState dictionary"?

How to fix "cannot find ExtGState dictionary" in mupdf?

在 Linux 我正在使用 mupdf library to convert a pdf to a png using the mudraw command:

mudraw -o thefile.png thefile.pdf 1

这通常工作得很好,但对于一个 pdf,我得到以下输出:

error: cannot find ExtGState dictionary
error: cannot set graphics state
warning: Ignoring errors during rendering
error: cannot find XObject dictionary when looking for: 'R132'
error: cannot draw xobject/image

因为没听说过ExtGState所以查了一下,根据PDF specs, "it specifies a PDEElement object's extended graphics state, which is part of its graphics state", or according to a post here on SO "It specifies a function that should be used for processing colors or color components".

我也找到了 the line of C-code on which the error gets thrown,但是由于我的 C 技能不是很好,而且我对 PDF 规范的了解更差,我真的不知道问题的根源是什么。

任何人都可以进一步说明这个错误,并可能指出我的解决方案吗?欢迎所有提示!

[编辑] 给我带来麻烦的文件可以是 downloaded here.

听起来您的 PDF 文件已损坏。正如 yms 所说,post 一个示例文件

[编辑] 该文件包含一个表单 XObject:

141 0 obj
<<
  /FormType 1
  /Subtype /Form
  /Type /XObject
  /BBox [ 2972.77002 2600.78003 6097.58008 3245.17993 ]
  /Matrix [ 1 0 0 1 0 0 ]
  /Length 91
  /Group 138 0 R
>>

这不包括 Resources 条目,因此任何通过引用定义的对象都必须从父 Resources 继承。流是:

stream
/R131 gs
q
2980 1958.9 2700 1340 re W n
q 3124.8 0 0 644.4 2972.78 2600.78 cm
/R132 Do
Q
Q
endstream

请注意,这使用了两个命名对象 /R131 和 /R132。从上下文我们可以看出 R131 是一个图形状态(实际上是一个 ExtGState),而 R132 是一个 XObject(图像或表单)。

这种形式似乎只在几个地方用作组,两次都用于 SMask。其中一个来自 Page 对象,作为 ExtGState,另一个虽然已定义但似乎根本没有被使用(在 PDF 文件中拥有未使用的对象是合法的)

所以它只在页面对象中使用了一次。由于 Form XObject 没有 Resources 字典,我们咨询它的父级(主页),它确实有 Resources 字典。但是那个 Resources 字典没有定义命名对象 R131 或 R132。这意味着 MuPDF 无法找到这些对象,因此无法使用它们。

所以基本上您的 PDF 文件是无效的。它会渲染(MuDraw 确实 从中渲染 PNG 文件),但结果可能不是预期的结果。我没办法说。

请注意,Adobe Acrobat 在查看此 PDF 文件时会引发错误。

假设您确实使用 Ghostscript 创建了这个文件(这就是 Producer 元数据所说的),我的建议是您升级到更新的版本。当前版本是 9.18,这是使用 2 年前的 9.10 创建的。然而,该文件也已使用我以前从未听说过的名为 TCT 5.7.0.1 的东西进行了修改。可能是这个修改破坏了文件,我看不出来。