Готовый к печати 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.
Заливки и обводки в device CMYK
Заголовок раздела «Заливки и обводки в device CMYK»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.
Плашечные / Separation краски с растром
Заголовок раздела «Плашечные / Separation краски с растром»Плашечный цвет — это одна именованная краска (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). Это правильно для обычных плашечных красок; нелинейная краска или измеренный профиль требуют пользовательского преобразования, что выходит за рамки этого рецепта.
Объявите output intent ICC
Заголовок раздела «Объявите output intent ICC»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. Используйте это, когда не хотите ничего объявлять. (Содержимое PDFDeviceRGBбез 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-условия этим рецептом не утверждаются.