Встроить цветовой профиль 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.


person Thayne    schedule 23.07.2015    source источник
comment
Ваш профиль, CoatedFOGRA27.icc, действительно находится в каталоге, где вы выполняете свою команду оболочки? В противном случае он должен находиться в одном из путей поиска Ghostscript по умолчанию, как сообщает gs -h.   -  person Kurt Pfeifle    schedule 24.07.2015
comment
да, это в каталоге, где я выполняю команду.   -  person Thayne    schedule 27.07.2015


Ответы (2)


Используйте 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 или типа бумаги, который не соответствует ожидаемому профилю вывода, также может привести к проблемам.

person Kurt Pfeifle    schedule 23.07.2015
comment
gs -version: GPL Ghostscript 9.16 (2015-03-30) Чтобы проверить профиль ICC, я распаковал PDF-файл и выполнил поиск ICCBased и имени профиля, который я использовал. - person Thayne; 23.07.2015
comment
@KurtPfeifle Похоже, что эта команда не должна встраивать цветовой профиль. Кроме того, я могу подтвердить этот метод показывает только ColorSpace: DeviceCMYK (для цвета заливки ячейки таблицы, который до преобразования был RGB). Кроме того, мне пришлось добавить -sProcessColorModel=DeviceCMYK, чтобы команда завершилась без ошибок, и -sColorConversionStrategy=CMYK, чтобы фактически преобразовать цвета RGB, которые у меня были. Я использую GS версии 9.26. - person Igor; 09.03.2019
comment
@VarunJoshi, я сомневаюсь, что смогу добавить что-нибудь полезное к этому ответу KenS. Действительно, только небольшое подмножество параметров управления цветом поддерживается для вывода в формате PDF. - person Igor; 12.06.2019
comment
-sDefaultCMYKProfile не имеет никакого эффекта - это связано с вводом (который не является CMYK); -sOutputICCProfile и -dRenderIntent не действуют, если только не произойдет растеризация; -dDeviceGrayToK - то же самое, наверное; -dOverrideICC=true обычно нежелательно и не имеет никакого эффекта, поскольку вопрос касается ввода DeviceRGB. - person Igor; 08.07.2019

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

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

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

  • #P4# <блочная цитата> #P5# #P6#
  • Попробуйте collink. (Мне никогда не удавалось чтобы сделать эту работу.)

Игрушечный пример

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

Colorbar foxit.PNG

Команда гс:

 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 (он игнорирует встроенное «Намерение вывода»): введите здесь описание изображения

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

  • The cmyk_des_renderintent.icc profile, as documented in "Ghostscript 9.21 Color Management", is designed such that different intents output different colors:
    • "Perceptual" rendering intent (0) outputs cyan only,
    • Намерение "RelativeColorimetric" (1) выводит только пурпурный цвет
    • Цель рендеринга «Насыщенность» (2) выводит только желтый цвет.
  • -dHaveTransparency=false следит за тем, чтобы 2-я страница растрировалась (из-за наличия tikz-картинки с прозрачностью)
  • -r20 гарантирует, что растеризация будет четко видна (из-за всего 20 точек на дюйм)
  • -sOutputICCProfile="cmyk_des_renderintent.icc" -dRenderIntent=1 makes rasterizer produce magenta output.
    • Note that OutputICCProfile parameter is not mentioned in current docs, since this (9.27 docs are a bit outdated).
    • 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 делает все возможное, чтобы поддерживать цветовые характеристики на входе без изменений на выходе». Похоже, что в данном случае они не особо фокусируются на таких вещах, как переход из одного профиля в другой. Ну... Вряд ли это "самая востребованная" фича.

person Igor    schedule 08.07.2019