Как я могу изменить определенный цвет RGB на определенный цвет CMYK в файле PDF?

Если у меня есть файл PDF с объектами (текст, штриховые рисунки) определенного цвета RGB, и я хочу преобразовать эти объекты в определенный цвет CMYK, какие библиотеки доступны, что позволит мне это сделать?

Обратите внимание, что мне не нужна возможность "сопоставлять" произвольные значения RGB с "подходящим" значением CMYK - эти значения предварительно определены.

.NET / C# предпочтительнее, но я бы рассмотрел почти все.

Очевидно, что я предпочел бы бесплатные / открытые библиотеки платным, но в зависимости от модели лицензирования я бы также рассмотрел платные.

1 ответ

Решение

Честно? Это невероятно нетривиально.

PDF рендеринг осуществляется с помощью программ, которые описывают то, что будет отображаться в последовательности. Существует графическое состояние, которое накапливает изменения, внесенные программой, а также помечает страницу.

Существует множество способов установки цветов. Надеемся, что в ваших PDF-документах используются только операторы RG и rg, которые задают цвета RGB для операций штриховки и без штриховки. Это означает, что цветовые операции будут иметь вид:

rf gf bf RG

где rf, gf и bf - числа с плавающей запятой, представляющие интенсивности цветовых каналов от 0,0 до 1,0.

Было бы вопросом переписать все операторы RG и rg для использования K и k соответственно, которые будут использовать 4-канальный CMYK.

Это само по себе является сложной задачей, так как вам придется прочитать в документе / странице, которую вы хотите, проанализировать поток контента и переписать новый, который заменит старый (опять же, возможно, но не тривиально - PDF позволяет вам заменить отдельные объекты, такие как поток контента, добавив новое поколение в файл). Не думай об использовании САС. PDF зависит от формата файла, и изменение чего-либо встроенного без сохранения той же длины приведет к разрыву PDF.

Настоящая проблема произойдет, если файл использует операторы CS и cs. Рассмотрим эту последовательность операций:

/DeviceRGB CS 1 0 0 SC 0 0 m 200 200 l S 200 200 m 200 0 l 0 1 0 SC S

Это означает установить цветовое пространство на DeviceRGB, установить красный цвет, переместить в (0, 0), линию в (200, 200), штрих (в красный), переместить в (200, 200), линию в (200, 0), установите цвет на зеленый и обведите.

Это не так просто - если вы хотите изменить красный цвет RGB на желтый CMYK, вы можете сделать это:

/DeviceCMYK CS 0 0 1 0 SC 0 0 m 200 200 l S 200 200 m 200 0 l 0 1 0 SC S

который будет работать для желтого, но прервет попытку установить зеленый, поскольку команда CS теперь требует 4 канала.

Что вам нужно сделать, это интерпретировать поток контента, отслеживая текущее цветовое пространство, и когда приходит команда CS, имеющая цвет, который вы хотите изменить, вам нужно заменить его на /DeviceCMYK CS c m y k SC, а затем Следующая команда r g b SC должна измениться на /DeviceRGB CS r g b SC.

При этом не учитывается, как обрабатывать основанные на ICC цветовые пространства, оттенки серого, LAB, n-channel, colormapped, шаблоны, формы и т. Д.

PDF не был сделан для редактирования.

Если бы мне было поручено сделать это, я бы сделал следующее:

  1. Если бы это было менее 10 файлов, я бы открыл их в Illustrator, изменил цвета и экспортировал в PDF
  2. Если бы это было на 10 или больше и меньше 1000, я бы нанял временного работника, чтобы сделать то, что я сделал в шаге 1.
  3. Если бы это было 1000 или больше и меньше 10000, я бы написал программу для сценария Illustrator, чтобы сделать эти изменения, если это возможно.
  4. Если бы это было 10000 или больше и продолжалось, я бы серьезно поговорил с руководством о создании документов, потому что, если такие изменения необходимо внести в формат файла терминала, и они не могут быть восстановлены правильно.
Другие вопросы по тегам