2

我正在使用Ghostscript 9.05从 PDF 生成图像作为应用程序的一部分(在 Java 中作为进程运行)。

我最近遇到了一个问题,其中一些 PDF 到图像的转换在 linux 机器上失败,并出现以下错误:

**** This file had errors that were repaired or ignored.
**** The file was produced by:
**** >>>> Acrobat Distiller 8.3.1 (Macintosh) <<<<
**** Please notify the author of the software that produced this
**** file that it does not conform to Adobe's published PDF 
**** specification.

每个页面都抛出与此类似的错误:

**** Warning: File has insufficient data for an image.
%%BoundingBox: 77 36 797 1082
%%HiResBoundingBox: 77.760003 36.720001 796.320030 1081.440041
Page 141
warning: ignoring invalid option raw
error: cannot decode code stream
unable to decode JPX image data.

但是,当在 Win7 机器上本地运行相同的转换时,不会发生错误。

我知道它的短而窄是“发回 PDF 并让他们给你发一份工作” - 但我很想知道为什么这会在 linux 机器上失败但成功而没有错误(并产生无错误的图像) 在 Windows 机器上?

有任何想法吗?

我现在不愿意打开错误报告,因为我不知道的 Linux 和 WIndows 版本之间可能存在显着差异。

更新

在查看了如何在我们的 Linux 机器上构建 Ghostscript(我们正在运行 Ubuntu 12.04 64 位长期支持版本)之后,我收集了以下信息:

对于 jpeg2000 操作,Ghostscript 使用 JasPer JPEG-2000 运行时库版本 1.900.1-13(JPEG-2000 第 1 部分的 ISO 参考实现)。

JasPer 是使用 libjpeg-turbo8 库构建的。

根据JasPer 网站

JasPer 软件已包含在 JPEG-2000 Part-5 标准(即 ISO/IEC 15444-5)中,作为 JPEG-2000 Part-1 编解码器的官方参考实现。

Ghostscript 被列为已知使用 JasPer 的项目之一。看来 Ubuntu 正在使用 JasPer,ISO 参考实现,并且 Ghostscript 的 Ubuntu 包源将 JasPer (libjasper-dev) 列为构建的依赖项,而不是 openJPEG。[来源]

目前看来唯一的选择是尝试不同版本的 linux,构建 ghostscript 版本并对其进行测试。

4

1 回答 1

3

一种可能是您正在运行 64 位 Linux 和 32 位 Windows 二进制文件。

然而,最可能的问题是您的 Linux 发行版选择使用“共享库”构建 Ghostscript。Ghostscript 使用的某些第 3 方库(例如,FReeType、Litle CMS 等)可以动态链接而不是静态链接,并在运行时加载。

我注意到图像是 JPX (JPEG 2000),这些将使用 OpenJPEG 库。然而,Ghostscript 附带的 OpenJPEG 源代码不是 1.5 版本,它是 1.5 加上从即将到来的 2.0 中提取的一些位以及我们需要添加的一些修复(并提供给上游,我们相信它们将被合并到 2.0 中)。我们希望在不久的将来发布下一个版本时使用此代码的标准版本。

如果您的 Linux 发行版选择使用 OpenJPEG 作为共享库来构建 Ghostscript,那么您将无法从这些源代码更改中受益,并且 JPX 解码器也无法正常工作。GS 的 Windows 版本没有“开箱即用”的方法来将第 3 方库构建为 DLL,因此(除非您自己做很多工作)它总是使用第 3 方的源代码我们提供的图书馆。

如果您自己从源代码(在 Linux 上)构建 GS,那么您很可能会发现它的表现非常好。我还冒昧地建议 PDF 文件实际上没有任何问题,只是使用的 OpenJPEG 版本。

每次我们提交到 Ghostscript 存储库时,我们都会进行大约 60,000 次测试,但显然我们是针对我们实际发布的代码进行这些测试。至少这意味着如果您使用我们提供的代码,我们对我们发送的内容有合理程度的信心。我们建议使用共享库构建 Ghostscript,但我们所说的任何内容都无法说服各种 Linux 发行商,因此我们必须接受它。

于 2012-08-14T13:43:50.163 回答