Przejdź do głównej zawartości
getnextpdf.com

Tworzenie koloru gotowego do druku: CMYK i kolory dodatkowe

Kolor na ekranie to RGB. Kolor w druku — nie. Gdy maszyna drukarska lub RIP do prób konsumuje Twój plik PDF, oczekuje atramentów procesowych (CMYK), okazjonalnego atramentu nazwanego (koloru dodatkowego lub Separation) oraz deklaracji warunku produkcji, jaki powinien przyjąć. Ten przepis pokazuje trzy ścieżki emisji koloru, które NextPDF daje Ci dla tej grupy odbiorców:

  • Wypełnienia i obrysy w device CMYKsetFillColorCmyk() / setDrawColorCmyk().
  • Atramenty dodatkowe/Separation na danym natężeniu — registerSpotColor(), a następnie setSpotFillColor() / setSpotDrawColor().
  • Wyjściowy intent ICC, który deklaruje warunek roboczy/wyjściowy RGB dla całego dokumentu — Config::withOutputColorProfile(). Dołączone profile to przestrzenie robocze RGB; nie deklaruje to prawdziwego warunku druku CMYK / PDF/X.

Uwaga o zakresie na wstępie: chodzi o emisję koloru. NextPDF zapisuje liczby CMYK, przestrzeń Separation oraz deklarację wyjściowego intentu, o które prosisz. Nie uruchamia transformacji zarządzania kolorem — nie przerenderuje Twojej grafiki RGB do docelowego gamutu CMYK, nie wykona miękkiej próby ani nie zagwarantuje wizualnego dopasowania. Dostarczaj kolory już określone dla Twojego warunku.

Okno terminala
composer require nextpdf/core:^3

Żadne opcjonalne rozszerzenie nie jest wymagane. API koloru jest stabilne od wersji 1.2.0 i działa na macierzy backportu 8.1–8.4.

CMYK jest domyślny dla offsetowego i cyfrowego druku procesowego: cztery kanały, cyjan / magenta / żółty / czarny („key”). Ustaw kolor wypełnienia lub obrysu, a następnie rysuj jak zwykle.

<?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');

Każde wywołanie emituje operator koloru DeviceCMYK do strumienia treści: k dla koloru niewypełniającego (wypełnienie/tekst) i K dla koloru obrysu, z czterema składowymi przeskalowanymi do zakresu 0.0–1.0, którego PDF używa wewnętrznie. ISO 32000-2 §8.6.8 (Operatory koloru, Tabela 73) definiuje k oraz K jako operatory ustawiające kolor DeviceCMYK; §8.6.4.4 definiuje samą przestrzeń koloru DeviceCMYK.

Bazowym obiektem wartości jest NextPDF\Graphics\Color. Jeśli budujesz kolory bezpośrednio, Color::cmyk($c, $m, $y, $k) przyjmuje te same wartości procentowe 0–100 i jest tym, co wywołuje każda metoda dokumentu …Cmyk.

Kolor dodatkowy to pojedynczy nazwany atrament — Pantone, HKS, lakier, płyta wykrojnika „cut” — który maszyna drukarska ładuje jako własną płytę, zamiast budować go z atramentów procesowych. W PDF jest to przestrzeń koloru Separation: nazwa kolorantu plus przestrzeń alternatywna (tu DeviceCMYK) i transformacja natężenia, która odwzorowuje wartość natężenia w [0, 1] na przestrzeń alternatywną, dzięki czemu renderery niedodatkowe wciąż pokazują przybliżenie.

Zarejestruj atrament raz z jego wartością awaryjną CMYK, a następnie ustaw go jako kolor wypełnienia lub obrysu na procentowym natężeniu:

<?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');

Musisz wywołać registerSpotColor(), zanim go wybierzesz; niezarejestrowana nazwa zgłasza PageLayoutException. Rejestracja zapisuje zasób Separation i transformację natężenia; setSpotFillColor() / setSpotDrawColor() emitują następnie /CS_<token> cs <tint> scn dla wypełnienia (lub wersję obrysu z wielkimi literami /CS_<token> CS <tint> SCN) względem tego zarejestrowanego zasobu Separation. W grę wchodzą tu dwie odrębne nazwy, a silnik obsługuje je osobno:

  • KLUCZ zasobu — token /CS_…, do którego odwołuje się operator strumienia treści i pod którym indeksowany jest słownik /Resources /ColorSpace strony — jest wyprowadzany z nazwy atramentu przez zastąpienie każdego znaku niebędącego znakiem słowa znakiem _, więc 'PANTONE 485 C' wybiera zasób /CS_PANTONE_485_C. (Dla nazw atramentów zawierających dosłowny _, łącznik lub inną interpunkcję dołączany jest krótki deterministyczny przyrostek, aby zachować klucz wolny od kolizji, dzięki czemu dwie niemal identyczne nazwy nigdy nie współdzielą jednej przestrzeni koloru.)
  • Sama nazwa kolorantu Separation — nazwa niesiona wewnątrz tablicy przestrzeni koloru [/Separation /<name> …] — jest zachowywana w niezmienionej postaci i kodowana przez zapisującego jako obiekt nazwy PDF, z szesnastkowym escapowaniem (#XX) każdego ogranicznika lub bajtu niedrukowalnego. Nie jest spłaszczana do tokenu CS_…; klucz zasobu i nazwa kolorantu są obliczane niezależnie.

Argument natężenia, który przekazujesz, jest wartością procentową, od 0 (papier) do 100 (pełny atrament), ale operand zapisywany do strumienia treści to wartość znormalizowana 0.0–1.0, więc natężenie 40 emituje /CS_PANTONE_485_C cs 0.400000 scn. ISO 32000-2 §8.6.6.4 obejmuje przestrzenie koloru Separation i ich transformację natężenia.

Domyślną transformacją natężenia jest interpolacja liniowa od [0 0 0 0] (papier przy natężeniu 0) do zarejestrowanej wartości awaryjnej CMYK (pełny atrament przy natężeniu 1). Jest to poprawne dla zwykłych atramentów dodatkowych; atrament nieliniowy lub zmierzony profil potrzebuje niestandardowej transformacji, co wykracza poza ten przepis.

PDF może nieść deklarację na poziomie dokumentu o warunku koloru, dla którego jego kolory zostały przygotowane — wyjściowy intent: słownik nazywający warunek produkcji, z docelowym profilem ICC osadzonym jako strumień ICCBased. W prawdziwym przepływie druk/PDF-X jest to warunek druku CMYK (na przykład profil powlekany FOGRA lub GRACoL). Profile, które NextPDF dołącza, są jednak przestrzeniami roboczymi RGB — więc to, co deklaruje Config::withOutputColorProfile(), jest wyjściowym warunkiem podglądu/przestrzeni roboczej RGB, a nie celem CMYK. Zanim oprzesz na nim wyjście do druku, zobacz uwagę pod przykładem.

NextPDF udostępnia to przez Config dokumentu. Wybierz jeden z dołączonych profili przestrzeni roboczej, zbuduj konfigurację i utwórz z niej dokument:

<?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 to wyliczenie przestrzeni roboczych, dla których silnik dołącza profil. Wszystkie przypadki oparte na profilu to trzyskładnikowe przestrzenie robocze RGB; DeviceRGB to domyślna wartownik i nie emituje żadnego wyjściowego intentu. Nie ma dołączonego docelowego profilu CMYK:

  • DeviceRGB — domyślny. Żaden wyjściowy intent nie jest emitowany: nie deklaruje się żadnego warunku wyjściowego na poziomie PDF, a potok PDF/A (jeśli aktywny) zachowuje wyłączną kontrolę nad tablicą /OutputIntents. Użyj tego, gdy nie chcesz żadnego deklarować. (Treść PDF DeviceRGB bez wyjściowego intentu jest zależna od urządzenia — nie jest zadeklarowanym sRGB.)
  • Srgb — emituje słownik wyjściowego intentu osadzający dołączony sRGB.icc, ze standardowym identyfikatorem warunku sRGB IEC61966-2.1.
  • DisplayP3, Rec2020, A98RGB, ProphotoRGB — przestrzenie robocze RGB o szerokim gamucie, z których każda osadza swój dołączony profil ICC pod niestandardowym (NextPDF wide-gamut …) identyfikatorem warunku.

Każdy przypadek inny niż DeviceRGB sprawia, że zapisujący emituje słownik wyjściowego intentu odwołujący się do osadzonego strumienia ICCBased (z jego liczbą składowych /N 3). ISO 32000-2 §14.11.5 definiuje słownik wyjściowego intentu; §8.6.5.5 definiuje przestrzeń koloru ICCBased, która niesie osadzony profil. W obecnym silniku ten słownik jest zapisywany z podtypem wyjściowego intentu PDF/X /GTS_PDFX niezależnie od tego, który dołączony profil wybierzesz (archiwizacyjna ścieżka PDF/A używa własnego podtypu /GTS_PDFA1 i jest emitowana osobno).

Ważne zastrzeżenie: ponieważ wszystkie dołączone profile to RGB, deklaruje to przestrzeń roboczą RGB dokumentu i intent podglądu — nie jest to docelowy profil CMYK i nie przekształca niczego w CMYK. Silnik nie pozwala dostarczyć niestandardowego docelowego profilu ICC CMYK przez withOutputColorProfile(). Prawdziwy wyjściowy intent CMYK druk/PDF-X wymaga przepływu, który osadza Twój własny profil ICC CMYK jako cel; dla archiwizacyjnego wyjściowego intentu wpiętego w tę samą tablicę /OutputIntents zobacz Wyjście PDF/A-4.

  • Device CMYK — domyślny dla dowolnej grafiki przeznaczonej na maszynę procesową. Określaj kolory w CMYK od samego początku, aby w dalszej części potoku nie zachodziło zgadywanie RGB→CMYK.
  • Dodatkowy/Separation — kolory marki, które muszą trafić w dokładny atrament, plus płyty nieprocesowe (lakier, biel, metalik, wykrojnik, folia). Zarejestruj raz, nakładaj na dowolnym natężeniu.
  • Wyjściowy intent — ustaw go, gdy chcesz, aby plik sam opisywał swój roboczy/wyjściowy warunek RGB, albo gdy konsument (przeglądarka, RIP z zarządzaniem kolorem, walidator) oczekuje zadeklarowanego warunku wyjściowego. Dołączone profile deklarują wyłącznie roboczy/wyjściowy warunek RGB; nie deklarują prawdziwego warunku druku CMYK / PDF/X.
  • Składowe CMYK są wartościami procentowymi (0–100), a nie 0–1. Metody dokumentu …Cmyk oraz Color::cmyk() przyjmują każdy kanał jako wartość procentową 0–100 i dzielą przez 100 przy zapisie operatora; operand strumienia treści to wartość znormalizowana 0.0–1.0. Przekaż 100 dla pełnego atramentu, a nie 1.0 (które silnik potraktowałby jako 1% atramentu).
  • Zarejestruj, zanim wybierzesz kolor dodatkowy. setSpotFillColor() / setSpotDrawColor() zgłaszają wyjątek, jeśli nazwa nigdy nie została zarejestrowana. Nazwy są dopasowywane dokładnie, łącznie z wielkością liter i spacjami.
  • Stan koloru utrzymuje się. Kolor CMYK lub dodatkowy pozostaje w mocy, dopóki go nie zmienisz. Zresetuj przed niepowiązanym blokiem.
  • Wartość awaryjna CMYK jest przybliżeniem. Transformacja natężenia Separation istnieje po to, aby renderery niedodatkowe mogły pokazać coś; nie jest to wyjście maszyny drukarskiej. Prawdziwym atramentem jest to, co wytwarza nazwana płyta.
  • Wyjściowy intent to deklaracja, a nie konwersja. Zadeklarowanie OutputColorProfile::Srgb nie przekształca Twoich kolorów w sRGB; podaje zamierzony warunek. Dokładność koloru jest Twoją odpowiedzialnością na wcześniejszym etapie.

Każdy wybór koloru to pojedynczy operator strumienia treści; kolor dodatkowy zapisuje dodatkowo jeden zasób Separation na zarejestrowany atrament. Osadzony profil wyjściowego intentu zapisywany jest raz na dokument. Wszystkie ścieżki mieszczą się z dużym zapasem w budżecie 2000 ms / 64 MB.

Ten przepis emituje wyłącznie kolory i profil, które określa Twój kod. Nie parsuje żadnego niezaufanego wejścia i nie wykonuje żadnego dostępu sieciowego. Jeśli nazwy kolorantów lub składowe CMYK pochodzą z danych zewnętrznych, waliduj je: ogranicz składowe do 0–100 i odrzucaj znaki sterujące w nazwach kolorów dodatkowych (bajt NUL w nazwie Separation jest odrzucany przez silnik).

StwierdzenieSpecyfikacjaKlauzula
k oraz K to operatory koloru ustawiające kolor niewypełniający / obrysu DeviceCMYK.ISO 32000-2§8.6.8
DeviceCMYK to subtraktywna czteroskładnikowa procesowa przestrzeń koloru.ISO 32000-2§8.6.4.4
Przestrzeń koloru Separation nazywa jeden kolorant, którego natężenie odwzorowuje się na przestrzeń alternatywną przez transformację natężenia.ISO 32000-2§8.6.6.4
Przestrzeń koloru ICCBased osadza strumień profilu ICC z liczbą składowych /N.ISO 32000-2§8.6.5.5
Wyjściowy intent deklaruje docelowy warunek produkcji; GTS_PDFX nazywa podtyp druku.ISO 32000-2§14.11.5

Profil odtwarzalności — strukturalny. Emisja koloru nie ma własnej entropii, ale każdy zapisany dokument niesie atomy /ID trailera i daty, a osadzony strumień ICC jest stabilny bajtowo tylko dla stałego dołączonego profilu. Wspieranym roszczeniem jest równość strukturalna po normalizacji qpdf. Ten przepis opisuje, jak NextPDF wytwarza strukturę; nie zgłasza ogólnego roszczenia zgodności z ISO 32000-2.

Nie dotyczy. Device CMYK, kolor dodatkowy/Separation oraz deklaracja wyjściowego intentu to możliwości Core bez bramki Premium. Core obsługuje pokazaną tu deklarację wyjściowego intentu RGB; niestandardowe przepływy ICC z warunkiem druku CMYK nie są przedmiotem roszczeń tego przepisu.