代笔/pdfwrite以彩色PDF和CMYK颜色而不是RGB生成灰色页面



Background

在 PHP Web 应用程序中,我使用 DomPDF 从 HTML 和 CSS 创建动态 PDF,并使用 Ghostscript 的pdfwrite设备将动态创建的 PDF 与两个现有的第三方 PDF 合并。

我有 3 个具有不同代笔版本的环境:

Dev  (Win10)    GPL Ghostscript 8.64 (2009-02-03) 
Test (Linux)    GPL Ghostscript 9.06 (2012-08-08) 
Prod (Linux)    GPL Ghostscript 8.70 (2009-07-31)

问题

预期

  • 所有页面合并到生成的 PDF 中
  • 明显色差

实际结果

  • 所有页面合并到生成的 PDF 中
  • 颜色在开发和测试环境中看起来符合预期(在 Win10 上使用 Adobe Reader 进行测试)
  • 在生产环境中,动态(已创建 DomPDF)页面
    • 看起来是灰色而不是彩色
    • 似乎有 CMYK 而不是 RGB 颜色,如 ImageMagick 6.9.9-34 Q16 x86 所识别的那样:

DOMPDF创建的PDF本身,这是在这里gs的输入,看起来很好。

在 PDF 上identify输出

(图片魔术 6.9.9-34 Q16 x86)

开发输出:

XXX.pdf[0] PDF 595x842 595x842+0+0 16-bit sRGB 69761B 0.000u 0:00.010
XXX.pdf[1] PDF 595x842 595x842+0+0 16-bit sRGB 69761B 0.000u 0:00.004
XXX.pdf[2] PDF 595x842 595x842+0+0 16-bit sRGB 69761B 0.000u 0:00.000

产品输出:

XXX.pdf[0] PDF 595x842 595x842+0+0 16-bit ColorSeparation CMYK 2004080B 0.016u 0:00.013
XXX.pdf[1] PDF 595x842 595x842+0+0 16-bit ColorSeparation CMYK 2004080B 0.016u 0:00.007
XXX.pdf[2] PDF 595x842 595x842+0+0 16-bit ColorSeparation CMYK 2004080B 0.000u 0:00.003

根据identify,所有在Prod上gs输入的PDF都是sRGB:

<third-party-pdf> PDF 595x842 595x842+0+0 16-bit sRGB 65728B 0.000u 0:00.000
<dompdf-created>  PDF 595x842 595x842+0+0 16-bit sRGB 29348B 0.000u 0:00.000

注意:我不确定identify的色彩空间到底是什么意思(因为PDF文档甚至页面不需要有单一的色彩空间AFAIK)。虽然大多数对象都是 RGB,但第三方 PDF 也可能包含一些潘通色对象。

到目前为止我尝试过什么

  • 初始命令行gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile={$concatenatedPDFTempFileName} {$pdfsToConcatString}(PHP变量语法在这里)
  • 花了几个小时试图找到这方面的文档或其他资源
  • 所有环境中gs选项之间的 3 路差异。
  • 尝试使用不同的明显命令开关的组合,例如-sColorConversionStrategy=RGB -dUseCIEColor=true -sOutputICCProfile=default_rgb.icc
  • 尝试将测试环境中的确切选项应用于 prod 上的 ghostscript,但我没有设法以易于重用的格式输出它们(也许有人对此有提示?

也许有人知道进一步调查的最有希望的方法是什么,或者例如,如何将测试环境的确切 gs 配置应用于生产环境(我怀疑它是否 100% 可能,因为涉及不同的版本)。

好吧,使用三个不同的(而且都是相当老的,即使是最新的也是 6 岁)版本的 Ghostscript 肯定不会有帮助。

首先要注意的是,Ghostscript不会"合并"PDF文件。实际过程描述如下:

因此,所有输入文件都将被完全解释,分解为图形基元,然后重新组合一个新文件。现在一般来说,除非另有指示,否则pdfwrite设备将尝试在原始颜色空间中保持颜色规范。你的观点是正确的,一个PDF文件可能包含多个不同的色彩空间,所以我会非常谨慎地对待"识别"结果。

您没有提供输入文件,也没有提供任何输出文件,所以我无法对它们进行任何分析,因此实际上无法告诉您发生了什么。Ghostscript本身,pdfwrite设备没有任何我认为您所期望的"配置"。所有配置都是通过命令行完成的,因此,如果您对所有安装运行相同的命令行,那么您正在运行相同的"配置"。

我不确定为什么您在"应用确切选项"时遇到麻烦。当然,您可以确定自己的代码正在创建的Ghostscript命令行?

无论如何,旧版本显然不如新版本功能丰富和功能强大。可以想象,您的 8.70 版本存在特定于您的错误,这是由于新功能造成的,该版本存在问题(请注意,此处的次要版本号凸起表示发生了重大变化)。这也可以解释为什么你从(非常)旧版本中获取sRGB,从新版本获得CMYK。

如果您提供要查看的文件,我会告诉您有什么区别。我的建议是在所有三个平台上使用相同的版本,我建议使用不到 6 年的软件可能会有所帮助。尤其是因为您让自己容易受到许多已知的、已发布的安全漏洞的侵害。其中至少有一个是在"野外"看到的。

我也不会使用您提供的一些命令行开关,-dUseCIEColor 是一个糟糕的主意,不要这样做(如果您这样做,新版本的 Ghostscript 会特别警告您)。不要在没有充分理由的情况下更改颜色转换策略。颜色管理在 8.x 和 9.x 系列之间完全更改,在此之前 -sOutptuICCProfile 将没有任何影响,因此您正在尝试应用早期版本中不支持的控件。

最新更新