Ghostscript / pdfwrite создает серую страницу в цветном PDF и CMYK цвете вместо RGB - PullRequest
0 голосов
/ 20 декабря 2018

Фон

В веб-приложении PHP я использую DomPDF для создания динамического PDF из HTML и CSS и устройство 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
  • Цвета выглядят так, как ожидалось вСреды разработки и тестирования (тестирование с помощью Adobe Reader на Win10)
  • В среде Prod динамическая (созданная DomPDF) страница
    • выглядит серой, а не цветной
    • , кажется, имеетCMYK вместо цвета RGB, как определено ImageMagick 6.9.9-34 Q16 x86:

Сам PDF-файл, созданный DOMPDF, который здесь вводится в gs,выглядит просто отлично.

identify вывод на PDFs

(ImageMagick 6.9.9-34 Q16 x86)

Выход на Dev :

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

Выход на Prod :

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

Все входные PDF-файлы для gs в Prod являются 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 здесь)
  • Потратил несколько часов, пытаясь найти документацию или другие ресурсы по этому
  • 3-стороннему различию между gs параметрами во всех средах.
  • пробовалкомбинации различных очевидных командных ключей, таких как -sColorConversionStrategy=RGB -dUseCIEColor=true -sOutputICCProfile=default_rgb.icc
  • , пытались применить точные параметры, как в тестовой среде, к ghostscript на prod, но мне не удалось вывести их в легко используемом формате (возможно, у кого-то естьнамек на это?)

Может быть, кто-то знает, что является наиболее перспективным подходом к дальнейшим исследованиям, или, например, как я могу применить точную конфигурацию gs тестовой среды к среде prod (сомневаюсьэто на 100% возможно, так как задействованы разные версии).

1 Ответ

0 голосов
/ 20 декабря 2018

Что ж, использование трех разных (и даже довольно старых, даже самой новой версии 6 лет) версий Ghostscript, безусловно, не поможет.

Первое, на что следует обратить внимание, это то, что Ghostscript делает не «объединять» файлы PDF.Фактический процесс описан здесь

Таким образом, все входные файлы будут полностью интерпретированы, разбиты на графические примитивы и затем новый файл будет заново собран.Теперь в целом, если не указано иное, устройство pdfwrite будет пытаться поддерживать спецификации цвета в исходном цветовом пространстве.Вы правы в том, что файл PDF может содержать несколько разных цветовых пространств, поэтому я бы отнесся к результатам «идентификации» с большой осторожностью.

Вы не указали ни входной файл, ни какие-либоиз выходных файлов, поэтому я не могу выполнить их анализ, так что на самом деле невозможно сказать вам, что происходит.Сам Ghostscript, и устройство pdfwrite не имеет никакой «конфигурации», как я думаю, вы ожидаете.Вся конфигурация выполняется через командную строку, поэтому, если вы используете одну и ту же командную строку для всех установок, значит, вы используете одну и ту же «конфигурацию».

Я не уверен, почему у вас возникают проблемы«применение точных опций».Конечно, вы можете определить командную строку Ghostscript, которую создает ваш собственный код?

В любом случае более старые версии, очевидно, менее многофункциональны и способны, чем более новые версии.Вполне возможно, что есть ошибка, специфичная для вашей версии 8.70, которая связана с новой функцией, которая имела проблему в этой версии (обратите внимание, что незначительное увеличение номера версии здесь указывает на что-то существенное, изменилось).Это также может объяснить, почему вы получаете sRGB из вашей (очень) старой версии и CMYK из более новой версии.

Если вы предоставите файлы для просмотра, я расскажу вам, в чем различия.Я бы посоветовал использовать одну и ту же версию на всех трех платформах, и я бы предположил, что использование программного обеспечения, которому менее 6 лет, вероятно, поможет.Не в последнюю очередь потому, что вы оставляете себя открытым для ряда известных, опубликованных угроз безопасности.По крайней мере, один из них был замечен «в дикой природе».

Я бы также не использовал некоторые из предоставленных вами ключей командной строки, -dUseCIEColor - ужасная идея, не так ли?сделать это (более новые версии Ghostscript будут специально предупреждать вас, если вы это сделаете).Не меняйте ColorConversionStrategy без уважительной причины.Управление цветом ** полностью изменилось * между сериями 8.x и 9.x, до этого -sOutptuICCProfile не будет иметь никакого эффекта, поэтому вы пытаетесь применить элементы управления, которые не поддерживаются в более ранней версии.

...