php - Ghostscript / pdfwrite 以彩色 PDF 和 CMYK 颜色而不是 RGB 生成灰色页面
问题描述
背景
在 PHP Web 应用程序中,我使用 DomPDF 从 HTML 和 CSS 创建动态 PDF,并使用 Ghostscript 的pdfwrite
设备将该动态创建的 PDF 与两个现有的第三方 PDF 合并。
我有 3 个具有不同 ghostscript 版本的环境:
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
Prod 上的所有输入 PDFgs
都是 sRGB,根据identify
:
<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 也可能包含一些 Pantone 色对象。
到目前为止我尝试过的
- 初始命令行是
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile={$concatenatedPDFTempFileName} {$pdfsToConcatString}
(此处为 PHP 变量语法) - 花了几个小时试图找到这方面的文档或其他资源
gs
所有环境中选项之间的3 路差异。- 尝试了不同的明显命令开关的组合,例如
-sColorConversionStrategy=RGB -dUseCIEColor=true -sOutputICCProfile=default_rgb.icc
- 尝试将测试环境中的确切选项应用于 prod 上的 ghostscript,但我没有设法以易于重用的格式输出它们(也许有人对此有提示?)
也许有人知道进一步调查最有希望的方法是什么,或者例如,我如何将测试环境的确切 gs 配置应用于 prod 环境(我怀疑它是 100% 可能的,因为涉及不同的版本)。
解决方案
好吧,使用三个不同的(而且都是相当老的,即使是最新的也是 6 岁)版本的 Ghostscript 肯定不会有帮助。
首先要注意的是 Ghostscript 不会“合并”PDF 文件。这里描述了实际的过程
因此,所有输入文件都将被完全解释,分解为图形基元,然后重新组装一个新文件。现在一般来说,除非另有说明,否则 pdfwrite 设备将尝试在原始颜色空间中保持颜色规范。您的观点是正确的,PDF 文件可能包含多个不同的颜色空间,因此我会非常谨慎地对待“识别”结果。
你没有提供输入文件,也没有提供任何输出文件,所以我无法对它们进行任何分析,所以它真的不可能告诉你发生了什么。Ghostscript 本身和 pdfwrite 设备没有我认为您期望的任何“配置”。所有配置都是通过命令行完成的,因此如果您为所有安装运行相同的命令行,那么您正在运行相同的“配置”。
我不确定为什么您在“应用确切的选项”时遇到问题。您肯定可以确定您自己的代码正在创建的 Ghostscript 命令行吗?
无论如何,旧版本显然不如新版本功能丰富和功能强大。可以想象,有一个特定于您的 8.70 版本的错误,这是由于一个新功能在该版本中存在问题(请注意,此处的次要版本号凸起表示发生了重大变化)。这也可以解释为什么您从(非常)旧版本中获得 sRGB,而从较新版本中获得 CMYK。
如果您提供要查看的文件,我会告诉您有什么区别。我的建议是在所有三个平台上使用相同的版本,我建议使用不到 6 年的软件可能会有所帮助。尤其是因为您让自己对许多已知的、已发布的安全漏洞持开放态度。至少其中一个已经“在野外”看到过。
我也不会使用您提供的某些命令行开关,-dUseCIEColor 是一个糟糕的主意,请不要这样做(如果您这样做,较新版本的 Ghostscript 会特别警告您)。不要无故更改 ColorConversionStrategy。颜色管理在 8.x 和 9.x 系列之间完全改变了,在此之前 -sOutptuICCProfile 将不起作用,因此您正在尝试应用早期版本不支持的控件。
推荐阅读
- microsoft-graph-api - 如何修复“用户登录”。已为您的租户禁用 Teams。图 api 调用中的错误
- java - 如果未找到实现 bean,则自动装配默认实现
- java - 如何确定小于给定输入值的所有素数?
- decimal - 是否有任何开放的数据库可以让我获得该货币的小数位数?
- reporting-services - MDX 在 MDX 工作室中运行良好。一旦我在 SSRS 中使用它,我就会收到以下错误“查询必须至少有一个轴。第一个轴..”
- c# - 不通过事件调用中断工作流程
- c# - Asp.Net Core 未经授权的登录 - C#
- javascript - 实现撤消功能:如何测量 JavaScript 数组的内存消耗?
- python - 设置一个成员变量字符串,其值为它的名字
- wordpress - 获取所有帖子如果在帖子中具有相同的自定义字段值