Перейти к содержимому
getnextpdf.com

Готовый к печати CMYK и плашечный цвет

Экранный цвет — это RGB. Печатный цвет — нет. Когда печатная машина или проофинг-RIP потребляет ваш PDF, ему нужны триадные краски (CMYK), изредка именованная краска (плашечный или Separation-цвет) и объявление производственного условия, которое ему следует предполагать. Этот рецепт показывает три пути эмиссии цвета, которые NextPDF даёт вам для этой аудитории:

  • Device CMYK заливки и обводки — setFillColorCmyk() / setDrawColorCmyk().
  • Плашечные / Separation краски с растром — registerSpotColor(), затем setSpotFillColor() / setSpotDrawColor().
  • Output intent ICC, который объявляет рабочее/выходное RGB-условие для всего документа — Config::withOutputColorProfile(). Упакованные профили — это рабочие RGB-пространства; это не объявляет настоящее CMYK-условие печатной машины / печатное условие PDF/X.

Замечание об охвате сразу: это эмиссия цвета. NextPDF записывает числа CMYK, пространство Separation и объявление output intent, которые вы запрашиваете. Он не выполняет преобразование управления цветом — он не перерисует вашу RGB-графику в целевой гамут CMYK, не выполнит для неё софт-пруф и не гарантирует визуального совпадения. Подавайте цвета, уже заданные для вашего условия.

Окно терминала
composer require nextpdf/core:^3

Никакого необязательного расширения не требуется. API цвета стабилен с версии 1.2.0 и работает на матрице бэкпорта 8.1–8.4.

CMYK — это значение по умолчанию для офсетной и цифровой триадной печати: четыре канала, голубой / пурпурный / жёлтый / чёрный («ключевой»). Задайте цвет заливки или обводки, затем рисуйте как обычно.

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->addPage();
// Components are percentages, 0–100 (cyan, magenta, yellow, key).
$doc->setFillColorCmyk(0, 95, 100, 0); // a process "red"
$doc->rect(20, 30, 60, 40, 'F');
$doc->setDrawColorCmyk(100, 0, 0, 0); // pure cyan rule
$doc->setLineWidth(1.0);
$doc->rect(20, 30, 60, 40, 'S');
$doc->setTextColorCmyk(0, 0, 0, 100); // rich-free 100% K text
$doc->setFont('helvetica', '', 12);
$doc->text(20, 85, 'Process CMYK');
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/cmyk.pdf');

Каждый вызов выдаёт оператор цвета DeviceCMYK в поток содержимого: k для нештрихующего (заливка/текст) цвета и K для штрихующего цвета, с четырьмя компонентами, масштабированными в диапазон 0.0–1.0, который PDF использует внутренне. ISO 32000-2 §8.6.8 (Colour Operators, таблица 73) определяет k и K как операторы задания цвета DeviceCMYK; §8.6.4.4 определяет само цветовое пространство DeviceCMYK.

Лежащий в основе объект-значение — NextPDF\Graphics\Color. Если вы строите цвета напрямую, Color::cmyk($c, $m, $y, $k) принимает те же проценты 0–100 и является тем, что вызывает каждый метод документа …Cmyk.

Плашечный цвет — это одна именованная краска (Pantone, HKS, лак, плашка вырубки), которую печатная машина загружает как собственную форму, а не строит из триадных красок. В PDF это цветовое пространство Separation: имя красителя плюс альтернативное пространство (здесь DeviceCMYK) и tint-transform, который отображает значение растра в [0, 1] на альтернативное, чтобы не-плашечные отрисовщики всё равно показывали приближение.

Зарегистрируйте краску один раз с её запасным CMYK, затем задайте её как цвет заливки или обводки на процент растра:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->addPage();
// Register the ink and its CMYK fallback (percentages, 0–100).
$doc->registerSpotColor('PANTONE 485 C', 0, 95, 100, 0);
// Full-strength fill.
$doc->setSpotFillColor('PANTONE 485 C'); // tint defaults to 100
$doc->rect(20, 30, 50, 30, 'F');
// 40% tint of the same ink.
$doc->setSpotFillColor('PANTONE 485 C', 40);
$doc->rect(80, 30, 50, 30, 'F');
// Same ink as a stroke at 75%.
$doc->setSpotDrawColor('PANTONE 485 C', 75);
$doc->setLineWidth(1.5);
$doc->line(20, 75, 130, 75);
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/spot.pdf');

Вы должны вызвать registerSpotColor() прежде, чем выбрать её; незарегистрированное имя выбрасывает PageLayoutException. Регистрация записывает ресурс Separation и tint-transform; затем setSpotFillColor() / setSpotDrawColor() выдают /CS_<token> cs <tint> scn для заливки (или штрихующую форму в верхнем регистре /CS_<token> CS <tint> SCN) против этого зарегистрированного ресурса Separation. Здесь в игре два различных имени, и движок обрабатывает их отдельно:

  • КЛЮЧ ресурса — токен /CS_…, на который ссылается оператор потока содержимого и под которым ключуется словарь /Resources /ColorSpace страницы, — выводится из имени краски заменой каждого несловного символа на _, поэтому 'PANTONE 485 C' выбирает ресурс /CS_PANTONE_485_C. (Для имён красок, содержащих буквальный _, дефис или иную пунктуацию, добавляется короткий детерминированный суффикс, чтобы ключ оставался без коллизий, поэтому два почти идентичных имени никогда не делят одно цветовое пространство.)
  • Само имя красителя Separation — имя, несомое внутри массива цветового пространства [/Separation /<name> …], — сохраняется как есть и кодируется писателем как объект-имя PDF, с hex-экранированием (#XX) любого разделителя или непечатаемого байта. Оно не уплощается до токена CS_…; ключ ресурса и имя красителя вычисляются независимо.

Аргумент растра, который вы передаёте, — это процент, 0 (бумага) до 100 (полная краска), но операнд, записываемый в поток содержимого, — это нормализованное значение 0.0–1.0, поэтому растр 40 выдаёт /CS_PANTONE_485_C cs 0.400000 scn. ISO 32000-2 §8.6.6.4 охватывает цветовые пространства Separation и их tint-transform.

Tint-transform по умолчанию — линейная интерполяция от [0 0 0 0] (бумага при растре 0) к зарегистрированному запасному CMYK (полная краска при растре 1). Это правильно для обычных плашечных красок; нелинейная краска или измеренный профиль требуют пользовательского преобразования, что выходит за рамки этого рецепта.

PDF может нести объявление на уровне документа о цветовом условии, для которого были подготовлены его цвета, — output intent: словарь, называющий производственное условие, со встроенным целевым профилем ICC как потоком ICCBased. В настоящем процессе печати/PDF-X это CMYK-условие печатной машины (например, мелованный профиль FOGRA или GRACoL). Однако профили, которые упаковывает NextPDF, — это рабочие RGB-пространства, поэтому то, что объявляет Config::withOutputColorProfile(), — это выходное условие просмотра / рабочего RGB-пространства, а не CMYK-цель. См. примечание под примером, прежде чем полагаться на это для печатного вывода.

NextPDF предоставляет это через Config документа. Выберите один из упакованных профилей рабочего пространства, постройте конфигурацию и создайте из неё документ:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;
use NextPDF\Core\Document;
use NextPDF\Core\OutputColorProfile;
// Declare an explicit, embedded output intent for the document.
$config = (new Config())
->withOutputColorProfile(OutputColorProfile::Srgb);
$doc = Document::createStandalone($config);
$doc->addPage();
$doc->setFillColorCmyk(0, 95, 100, 0);
$doc->rect(20, 30, 60, 40, 'F');
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/with-intent.pdf');

OutputColorProfile — это перечисление рабочих пространств, для которых движок упаковывает профиль. Все случаи, подкреплённые профилем, — это трёхкомпонентные рабочие RGB-пространства; DeviceRGB — это часовой по умолчанию и не выдаёт output intent. Упакованного целевого профиля CMYK нет:

  • DeviceRGB — значение по умолчанию. Output intent не выдаётся: никакое выходное условие на уровне PDF не объявляется, а конвейер PDF/A (если активен) сохраняет исключительный контроль над массивом /OutputIntents. Используйте это, когда не хотите ничего объявлять. (Содержимое PDF DeviceRGB без output intent зависит от устройства — это не объявленный sRGB.)
  • Srgb — выдаёт словарь output intent, встраивающий упакованный sRGB.icc, со стандартным идентификатором условия sRGB IEC61966-2.1.
  • DisplayP3, Rec2020, A98RGB, ProphotoRGB — широкогамутные рабочие RGB-пространства, каждое со встраиванием своего упакованного профиля ICC под пользовательским (NextPDF wide-gamut …) идентификатором условия.

Любой случай, кроме DeviceRGB, заставляет писателя выдать словарь output intent, ссылающийся на встроенный поток ICCBased (с его счётчиком компонентов /N 3). ISO 32000-2 §14.11.5 определяет словарь output intent; §8.6.5.5 определяет цветовое пространство ICCBased, несущее встроенный профиль. В текущем движке этот словарь записывается с подтипом output intent PDF/X /GTS_PDFX независимо от того, какой упакованный профиль вы выбираете (архивный путь PDF/A использует собственный подтип /GTS_PDFA1 и выдаётся отдельно).

Важная оговорка: поскольку все упакованные профили — RGB, это объявляет рабочее RGB-пространство документа и намерение просмотра — это не целевой профиль CMYK, и он ничего не преобразует в CMYK. Движок не позволяет вам подать пользовательский целевой ICC CMYK через withOutputColorProfile(). Настоящий output intent CMYK для печати/PDF-X требует процесса, который встраивает ваш собственный профиль ICC CMYK как цель; об архивном output intent, подключённом в тот же массив /OutputIntents, см. Вывод PDF/A-4.

  • Device CMYK — значение по умолчанию для любой графики, предназначенной для триадной печатной машины. Задавайте свои цвета в CMYK с самого начала, чтобы ниже по конвейеру не происходило гадания RGB→CMYK.
  • Плашечный / Separation — фирменные цвета, которые должны попасть в точную краску, плюс не-триадные формы (лак, белила, металлик, вырубка, фольга). Зарегистрируйте один раз, наносите при любом растре.
  • Output intent — задавайте его, когда хотите, чтобы файл сам описывал своё рабочее/выходное RGB-условие, либо когда потребитель (просмотрщик, RIP с управлением цветом, валидатор) ожидает объявленного выходного условия. Упакованные профили объявляют только рабочее/выходное RGB-условие; они не объявляют настоящее CMYK-условие печатной машины / печатное условие PDF/X.
  • Компоненты CMYK — это проценты (0–100), а не 0–1. Методы документа …Cmyk и Color::cmyk() принимают каждый канал как процент 0–100 и делят на 100 при записи оператора; операнд потока содержимого — это нормализованное значение 0.0–1.0. Передавайте 100 для полной краски, а не 1.0 (которое движок трактовал бы как 1% краски).
  • Регистрируйте до выбора плашки. setSpotFillColor() / setSpotDrawColor() выбрасывают исключение, если имя никогда не регистрировалось. Имена сопоставляются точно, включая регистр и пробелы.
  • Состояние цвета сохраняется. Цвет CMYK или плашечный цвет остаётся в силе, пока вы его не измените. Сбрасывайте перед несвязанным блоком.
  • Запасной CMYK — это приближение. Tint-transform Separation существует, чтобы не-плашечные отрисовщики могли показать что-то; это не печатный вывод. Настоящая краска — это то, что выдаёт именованная форма.
  • Output intent — это объявление, а не преобразование. Объявление OutputColorProfile::Srgb не преобразует ваши цвета в sRGB; оно констатирует предполагаемое условие. Точность цвета — ваша ответственность выше по конвейеру.

Каждый выбор цвета — это один оператор потока содержимого; плашка также записывает один ресурс Separation на зарегистрированную краску. Встроенный профиль output intent записывается один раз на документ. Все пути остаются с хорошим запасом внутри бюджета 2000 мс / 64 МБ.

Этот рецепт выдаёт только цвета и профиль, которые задаёт ваш код. Он не разбирает недоверенного ввода и не делает сетевого доступа. Если имена красителей или компоненты CMYK поступают из внешних данных, валидируйте их: ограничьте компоненты диапазоном 0–100 и отклоняйте управляющие символы в именах плашек (байт NUL в имени Separation отклоняется движком).

УтверждениеСпецификацияПункт
k и K — это операторы цвета, задающие нештрихующий / штрихующий цвет DeviceCMYK.ISO 32000-2§8.6.8
DeviceCMYK — это субтрактивное четырёхкомпонентное триадное цветовое пространство.ISO 32000-2§8.6.4.4
Цветовое пространство Separation называет один краситель, чей растр отображается на альтернативное пространство через tint-transform.ISO 32000-2§8.6.6.4
Цветовое пространство ICCBased встраивает поток профиля ICC со счётчиком компонентов /N.ISO 32000-2§8.6.5.5
Output intent объявляет целевое производственное условие; GTS_PDFX называет печатный подтип.ISO 32000-2§14.11.5

Профиль воспроизводимости — structural. У эмиссии цвета нет собственной энтропии, но каждый сохранённый документ несёт трейлер /ID и атомы даты, а встроенный поток ICC побайтово стабилен только для фиксированного упакованного профиля. Поддерживаемое утверждение — структурное равенство после нормализации qpdf. Этот рецепт описывает, как NextPDF создаёт структуру; он не утверждает сплошного соответствия ISO 32000-2.

Неприменимо. Device CMYK, плашечный/Separation-цвет и объявление output intent — это возможности Core без премиум-шлюза. Core поддерживает показанное здесь объявление output intent RGB из упакованных профилей; пользовательские процессы ICC для печатного CMYK-условия этим рецептом не утверждаются.