代码之家  ›  专栏  ›  技术社区  ›  Michael Jaros

Ghostscript/pdfwrite生成彩色PDF和CMYK颜色的灰色页面,而不是RGB

  •  0
  • Michael Jaros  · 技术社区  · 7 年前

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

    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进行测试)
    • 在Prod环境中,动态(DomPDF创建)页面
      • 看起来是灰色的而不是彩色的
      • 似乎有CMYK而不是RGB颜色,如ImageMagick 6.9.9-34 Q16 x86所示:

    DOMPDF创建了PDF本身,它是 gs 这里,看起来很好。

    identify PDF上的输出

    (ImageMagick 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
    

    gs 在产品上是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
    

    注: 识别 的颜色空间意味着完全相同(因为PDF文档甚至页面都不需要单独的颜色空间AFAIK)。虽然大多数对象是RGB,但第三方PDF也可能包含一些Pantone颜色的对象。

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

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   KenS    7 年前

    好吧,使用三种不同版本的Ghostscript(而且都相当老,甚至最新版本也有6年历史)肯定不会有什么帮助。

    首先要注意的是,Ghostscript确实如此 “合并”PDF文件。描述了实际过程 here

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

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

    无论如何,较旧的版本显然比较新的版本功能更丰富、功能更强。可以想象,您的8.70版本可能有一个特定的bug,这是由于一个新特性造成的,该特性在该版本中有一个问题(请注意,此处的小版本号凹凸表示发生了重大更改)。这也可以解释为什么从(非常)旧的版本获得sRGB,从更新的版本获得CMYK。

    如果你提供文件让我看,我会告诉你区别是什么。我的建议是在所有三个平台上使用相同的版本,我建议使用不到6年的软件可能会有所帮助。不仅仅是因为您将自己暴露在许多已知的、已发布的安全漏洞之下。其中至少有一个在“野外”见过。

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

    推荐文章