Вставить цветовой профиль ICC в PDF

Я создаю PDF, где вся графика рисуется в \DeviceRGB в цветовом пространстве sRGB. Я хотел бы преобразовать PDF в другой цветовой профиль, используя профиль ICC, и встроить профиль ICC, но я не могу найти хороший инструмент для этого.

Я пробовал ImageMagick, но это растеризует PDF, что нежелательно, и я пытался использовать Ghostscript. Но в то время как это преобразует цвета, оно не встраивает профиль ICC.

Есть ли какой-нибудь инструмент или библиотека (желательно Java или Scala) для Linux, которая делает то, что я хочу?

Команды Ghostscript, которые я пробовал:

gs -o cmyk.pdf -sColorConversionStrategy=CMYK -sDEVICE=pdfwrite \
   -dOverrideICC=true -sOutputICCProfile=CoatedFOGRA27.icc \
   -dRenderIntent=3 in.pdf

а также

gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -ColorConversionStrategy=CMYK \
   -dProcessColorModel=/DeviceCMYK -sOutputICCProfile=CoatedFOGRA27.icc \
   -sOutputFile=cmyk.pdf in.pdf 

и несколько вариаций вышеперечисленного. Я пробовал Ghostscript версии 9.10 и 9.16.

1 ответ

Используйте Ghostscript.

Используйте последнюю версию, v9.16.

Скачать здесь:

Прочитайте его (последнюю) документацию о поддержке цветового профиля ICC, доступную здесь:

Команда, которая преобразует цветовое пространство и внедряет профиль ICC:

gs -o cmyk-doc.pdf      \
   -sDEVICE=pdfwrite    \
   -dOverrideICC=true   \
   -sDefaultCMYKProfile=/path/to/mycmykprofile.icc \
   -sOutputICCProfile=/path/to/mydeviceprofile.icc \
   -dRenderIntent=3     \
   -dDeviceGrayToK=true \
    input-doc.pdf

(-dRenderIntent: возможные аргументы 0 (Перцепционный), 1 (Колориметрический), 2 (Насыщенность) и 3 (Абсолютный колориметрический).)

Предостережения

Если вы посмотрите на PDF-файл на экране (или на бумаге, когда он напечатан), преобразованный с помощью вышеуказанной команды, и используйте...

  • ... некалиброванный монитор / экран,
  • ... некалиброванное печатающее устройство,
  • ... некалиброванное освещение помещения,
  • ... читатель PDF, который не может обрабатывать встроенные профили ICC,

Вы можете быть к большому разочарованию. Или вы использовали неправильный профиль ICC. Или вы использовали тип бумаги, который не соответствует ожидаемому профилем вывода. Или вы недостаточно хорошо понимаете управление цветом ICC.

Но не обвиняйте Ghostscript в реакции коленного рефлекса за взгляды результата, которого вы не ожидали...

AFAIU, Ghostscript 9.12-9.27 не может делать то, что вы ожидаете.
Но вы можете частично достичь своих целей:

  • Пытаться UseDeviceIndependentColor.
    Это не приведет к встраиванию вашего профиля и не преобразует цвета в ваш профиль. Но это сделало бы ваши цвета "колориметрически определенными" и включило бы некоторый профиль icc. Если ваша цель - "сохранить" цвета, это может сработать для вас.

  • Попробуйте вывод PDF/X-3, вставьте icc-профиль "Output Intent".

  • Попробуйте настроить цветовое пространство DefaultRGB - обратите внимание на следующую фразу в документации:

    Если пользователю требуется нетривиальная настройка цвета, необходимо определить нетривиальное цветовое пространство DefaultRGB.

    (Никогда не пробовал.)

  • Попробуйте коллинк. (Мне никогда не удавалось заставить это работать.)

Пример игрушки

Исходный файл:

Команда gs:

 gswin64c -dPDFX -dBATCH -dNOPAUSE -dHaveTransparency=false -r20 
  -dProcessColorModel=/DeviceCMYK -sColorConversionStrategy=UseDeviceIndependentColor 
  -sDefaultRGBProfile="default_rgb.icc" -sOutputICCProfile="cmyk_des_renderintent.icc" 
  -dRenderIntent=1 -dDefaultRenderingIntent=/Perceptual -sDEVICE=pdfwrite 
  -sOutputFile=colorbar_v1.pdf PDFX_IntCmyk.ps Colorbar.pdf

Результат в Adobe Acrobat (он учитывает встроенный icc-профиль "Output Intent") выглядит следующим образом:

Тот же файл в Foxit Reader (игнорирует встроенное "намерение вывода"):

Что тут происходит:

  • Cmyk_des_renderintent.icc профиль, как описано в "Ghostscript 9.21 Управление цветом", разработан таким образом, что различные намерения вывода различных цветов:
    • "Перцепционный" метод рендеринга (0) выводит только голубой цвет,
    • "RelativeColorimetric" intent (1) выводит только пурпурный цвет
    • Метод визуализации "Насыщенность" (2) выводит только желтый цвет.
  • -dHaveTransparency=false обеспечивает растеризацию 2-й страницы (из-за наличия картинки тикз с прозрачностью)
  • -r20 гарантирует, что растеризация будет четко видна (всего лишь 20 точек на дюйм)
  • -sOutputICCProfile="cmyk_des_renderintent.icc" -dRenderIntent=1 заставляет растеризатор выдавать пурпурный цвет.
    • Обратите внимание, что OutputICCProfileпараметр не упоминается в текущих документах, так как этот ( 9.27 документы немного устарели).
    • RenderIntentтакже недокументировано в этом контексте. Это также влияет только на растеризацию.
  • -dDefaultRenderingIntent=/Perceptualпомещает указанное намерение в метаданные вместе с "ICC-профилем выходного намерения". Это позволяет Acrobat рисовать все в голубом цвете.
  • -sDefaultRGBProfile="default_rgb.icc"это заполнитель для возможных экспериментов с входными профилями icc. То же значение по умолчанию устанавливается, если этот параметр не указан.
    Если вы знаете, что ваш входной профиль - sRGB (но он не встроен - pdf простой\DefaultRGB), было бы неплохо явно указать здесь профиль. Хотя по умолчанию используется sRGB.
  • Я использую модифицированный файл gs/lib/PDFX_def.ps из репозитория Ghostscript, в который встроеныcmyk_des_renderintent.icc как "Выходное намерение".

Вы можете найти все файлы, используемые в этом эксперименте здесь. Есть еще несколько экспериментов. Я создал их, пытаясь понять, как работает управление цветом в gs. Надеюсь, они пролили свет на эту тему. Также есть сравнение с инструментом Adobe Acrobat "Преобразование цветов". AFAIU, он делает именно то, что вы ожидаете.

Когда дело доходит до управления цветом для вывода pdf, KenS (gs dev) обычно говорит, что "устройство pdfwrite делает все возможное, чтобы сохранить характеристики цвета на входе без изменений на выходе". Похоже, что в данном случае они не особо сосредотачиваются на таких вещах, как переход из одного профиля в другой. Что ж... Это вряд ли "самая востребованная" функция.

Другие вопросы по тегам