Produrre colori CMYK e tinte piatte pronti per la stampa
In sintesi
Sezione intitolata “In sintesi”Il colore a schermo è RGB. Il colore di stampa non lo è. Quando una macchina da stampa o un RIP di prova consuma il proprio PDF, vuole inchiostri di processo (CMYK), l’occasionale inchiostro con nome (un colore spot o Separation) e una dichiarazione della condizione di produzione che deve presupporre. Questa ricetta mostra i tre percorsi di emissione del colore che NextPDF offre per quel pubblico:
- Riempimenti e tracciamenti in CMYK di dispositivo —
setFillColorCmyk()/setDrawColorCmyk(). - Inchiostri spot / Separation a una determinata tinta —
registerSpotColor(), poisetSpotFillColor()/setSpotDrawColor(). - Un output intent ICC che dichiara una condizione di lavoro/output RGB per l’intero documento —
Config::withOutputColorProfile(). I profili inclusi sono spazi di lavoro RGB; questo non dichiara una vera condizione di stampa CMYK / PDF/X.
Una nota di ambito in apertura: questa è emissione del colore. NextPDF scrive i numeri CMYK, lo spazio Separation e la dichiarazione dell’output intent richiesta. Non esegue una trasformazione di gestione del colore — non ridisegnerà l’artwork RGB in un gamut CMYK di destinazione, non eseguirà soft-proof né garantirà una corrispondenza visiva. Fornire colori già specificati per la propria condizione.
Installazione
Sezione intitolata “Installazione”composer require nextpdf/core:^3Non è richiesta alcuna estensione facoltativa. L’API del colore è stabile fin dalla 1.2.0 ed è eseguibile sulla matrice di backport 8.1–8.4.
Riempimenti e tracciamenti in CMYK di dispositivo
Sezione intitolata “Riempimenti e tracciamenti in CMYK di dispositivo”Il CMYK è l’impostazione predefinita per la stampa di processo offset e digitale: quattro canali, ciano / magenta / giallo / nero (il “key”). Impostare il colore di riempimento o di tracciamento, quindi disegnare come di consueto.
<?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');Ogni chiamata emette un operatore di colore DeviceCMYK nel content stream: k per il colore non di tracciamento (riempimento/testo) e K per il colore di tracciamento, con i quattro componenti scalati all’intervallo 0.0–1.0 che il PDF usa internamente. ISO 32000-2 §8.6.8 (Colour Operators, Table 73) definisce k e K come gli operatori di impostazione del colore DeviceCMYK; §8.6.4.4 definisce lo stesso spazio colore DeviceCMYK.
Il value object sottostante è NextPDF\Graphics\Color. Se si costruiscono i colori direttamente, Color::cmyk($c, $m, $y, $k) accetta le stesse percentuali 0–100 ed è ciò che chiama ogni metodo …Cmyk del documento.
Inchiostri spot / Separation a una determinata tinta
Sezione intitolata “Inchiostri spot / Separation a una determinata tinta”Un colore spot è un singolo inchiostro con nome — un Pantone, un HKS, una vernice, una lastra di “taglio” per fustellatura — che la macchina da stampa carica come lastra a sé stante anziché costruirlo dagli inchiostri di processo. In PDF è uno spazio colore Separation: un nome di colorante più uno spazio alternativo (qui DeviceCMYK) e una tint-transform che mappa un valore di tinta in [0, 1] allo spazio alternativo, così che i renderer non-spot mostrino comunque un’approssimazione.
Registrare l’inchiostro una volta con il suo ripiego CMYK, quindi impostarlo come colore di riempimento o di tracciamento a una percentuale di tinta:
<?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');Occorre eseguire registerSpotColor() prima di selezionarlo; un nome non registrato solleva una PageLayoutException. La registrazione scrive la risorsa Separation e la tint-transform; setSpotFillColor() / setSpotDrawColor() emettono quindi /CS_<token> cs <tint> scn per un riempimento (oppure la forma di tracciamento maiuscola /CS_<token> CS <tint> SCN) rispetto a quella risorsa Separation registrata. Qui sono in gioco due nomi distinti, e il motore li gestisce separatamente:
- La CHIAVE della risorsa — il token
/CS_…a cui fa riferimento l’operatore del content stream e sotto cui è indicizzato il dizionario/Resources /ColorSpacedella pagina — è derivata dal nome dell’inchiostro sostituendo ogni carattere non-word con_, perciò'PANTONE 485 C'seleziona la risorsa/CS_PANTONE_485_C. (Per i nomi di inchiostro che contengono un_letterale, un trattino o altra punteggiatura, viene aggiunto un breve suffisso deterministico per mantenere la chiave priva di collisioni, così che due nomi quasi identici non condividano mai uno spazio colore.) - Lo stesso nome del colorante Separation — il nome contenuto nell’array dello spazio colore
[/Separation /<name> …]— viene mantenuto così com’è e codificato dal writer come oggetto nome PDF, applicando l’escape esadecimale (#XX) a qualsiasi delimitatore o byte non stampabile. Non viene appiattito sul tokenCS_…; la chiave della risorsa e il nome del colorante sono calcolati in modo indipendente.
L’argomento di tinta che si passa è una percentuale, da 0 (carta) a 100 (inchiostro pieno), ma l’operando scritto nel content stream è il valore normalizzato 0.0–1.0, perciò una tinta 40 emette /CS_PANTONE_485_C cs 0.400000 scn. ISO 32000-2 §8.6.6.4 copre gli spazi colore Separation e la loro tint-transform.
La tint-transform predefinita è un’interpolazione lineare da [0 0 0 0] (carta a tinta 0) al ripiego CMYK registrato (inchiostro pieno a tinta 1). Questo è corretto per gli ordinari inchiostri spot; un inchiostro non lineare o un profilo misurato richiede una trasformazione personalizzata, che esula da questa ricetta.
Dichiarare un output intent ICC
Sezione intitolata “Dichiarare un output intent ICC”Il PDF può portare una dichiarazione a livello di documento della condizione di colore per cui i suoi colori sono stati preparati — un output intent: un dizionario che nomina la condizione di produzione, con il profilo ICC di destinazione incorporato come stream ICCBased. In un vero workflow di stampa/PDF-X questa è una condizione di stampa CMYK (un profilo FOGRA o GRACoL patinato, ad esempio). I profili che NextPDF include, tuttavia, sono spazi di lavoro RGB — perciò ciò che Config::withOutputColorProfile() dichiara è una condizione di output di visualizzazione/lavoro RGB, non una destinazione CMYK. Si veda la nota sotto l’esempio prima di farvi affidamento per l’output di stampa.
NextPDF espone questo attraverso il Config del documento. Scegliere uno dei profili di spazio di lavoro inclusi, costruire la configurazione e creare il documento a partire da essa:
<?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 è un enum di spazi di lavoro per cui il motore include un profilo. Tutti i casi supportati da un profilo sono spazi di lavoro RGB a tre componenti; DeviceRGB è il sentinel predefinito e non emette alcun output intent. Non esiste un profilo di destinazione CMYK incluso:
DeviceRGB— l’impostazione predefinita. Nessun output intent viene emesso: nessuna condizione di output a livello di PDF viene dichiarata, e la pipeline PDF/A (se attiva) mantiene il controllo esclusivo dell’array/OutputIntents. Usarlo quando non si desidera dichiararne uno. (Il contenuto PDFDeviceRGBsenza output intent è dipendente dal dispositivo — non è un sRGB dichiarato.)Srgb— emette un dizionario di output intent che incorpora ilsRGB.iccincluso, con l’identificatore di condizione standardsRGB IEC61966-2.1.DisplayP3,Rec2020,A98RGB,ProphotoRGB— spazi di lavoro RGB a gamut ampio, ciascuno dei quali incorpora il proprio profilo ICC incluso sotto un identificatore di condizione personalizzato (NextPDF wide-gamut …).
Qualsiasi caso diverso da DeviceRGB fa sì che il writer emetta un dizionario di output intent che fa riferimento allo stream ICCBased incorporato (con il suo conteggio di componenti /N 3). ISO 32000-2 §14.11.5 definisce il dizionario di output intent; §8.6.5.5 definisce lo spazio colore ICCBased che porta il profilo incorporato. Nel motore attuale questo dizionario viene scritto con il sottotipo di output intent PDF/X /GTS_PDFX indipendentemente dal profilo incluso che si sceglie (il percorso di archiviazione PDF/A usa il proprio sottotipo /GTS_PDFA1 ed è emesso separatamente).
L’avvertenza importante: poiché tutti i profili inclusi sono RGB, questo dichiara lo spazio di lavoro RGB e l’intento di visualizzazione del documento — non è un profilo di destinazione CMYK e non trasforma nulla in CMYK. Il motore non consente di fornire un profilo ICC di destinazione CMYK personalizzato tramite withOutputColorProfile(). Un vero output intent CMYK di stampa/PDF-X richiede un workflow che incorpori il proprio profilo ICC CMYK come destinazione; per un output intent di archiviazione collegato allo stesso array /OutputIntents, si veda Output PDF/A-4.
Quando ricorrere a ciascuno
Sezione intitolata “Quando ricorrere a ciascuno”- CMYK di dispositivo — l’impostazione predefinita per qualsiasi artwork destinato a una macchina da stampa di processo. Specificare i propri colori in CMYK fin dall’inizio in modo che a valle non avvenga alcuna congettura RGB→CMYK.
- Spot / Separation — colori di brand che devono colpire un inchiostro esatto, oltre alle lastre non di processo (vernice, bianco, metallizzato, fustellatura, foil). Registrare una volta, dipingere a qualsiasi tinta.
- Output intent — impostarlo quando si desidera che il file si auto-descriva riguardo alla propria condizione di lavoro/output RGB, oppure quando un consumatore (un visualizzatore, un RIP gestito a colori, un validatore) si aspetta una condizione di output dichiarata. I profili inclusi dichiarano soltanto una condizione di lavoro/output RGB; non dichiarano una vera condizione di stampa CMYK / PDF/X.
Casi limite e insidie
Sezione intitolata “Casi limite e insidie”- I componenti CMYK sono percentuali (0–100), non 0–1. I metodi
…Cmykdel documento eColor::cmyk()accettano ciascun canale come percentuale0–100e dividono per 100 quando scrivono l’operatore; l’operando del content stream è il valore normalizzato0.0–1.0. Passare100per l’inchiostro pieno, non1.0(che il motore tratterebbe come inchiostro all’1%). - Registrare prima di selezionare uno spot.
setSpotFillColor()/setSpotDrawColor()sollevano un’eccezione se il nome non è mai stato registrato. I nomi vengono abbinati esattamente, inclusi maiuscole/minuscole e spazi. - Lo stato del colore persiste. Un colore CMYK o spot resta in vigore finché non lo si cambia. Reimpostarlo prima di un blocco non correlato.
- Il ripiego CMYK è un’approssimazione. La tint-transform Separation esiste affinché i renderer non-spot possano mostrare qualcosa; non è l’output di stampa. L’inchiostro reale è ciò che produce la lastra con nome.
- Un output intent è una dichiarazione, non una conversione. Dichiarare
OutputColorProfile::Srgbnon trasforma i propri colori in sRGB; ne enuncia la condizione prevista. L’accuratezza del colore è una responsabilità di chi opera a monte.
Prestazioni
Sezione intitolata “Prestazioni”Ogni selezione di colore è un singolo operatore del content stream; uno spot scrive inoltre una risorsa Separation per ogni inchiostro registrato. Un profilo di output intent incorporato viene scritto una volta per documento. Tutti i percorsi restano ben all’interno del budget di 2000 ms / 64 MB.
Note sulla sicurezza
Sezione intitolata “Note sulla sicurezza”Questa ricetta emette soltanto i colori e il profilo specificati dal proprio codice. Non analizza alcun input non attendibile e non effettua alcun accesso di rete. Se i nomi dei coloranti o i componenti CMYK provengono da dati esterni, convalidarli: limitare i componenti a 0–100 e rifiutare i caratteri di controllo nei nomi spot (un byte NUL in un nome Separation viene rifiutato dal motore).
Conformità
Sezione intitolata “Conformità”| Affermazione | Spec | Clausola |
|---|---|---|
k e K sono gli operatori di colore che impostano il colore DeviceCMYK non di tracciamento / di tracciamento. | ISO 32000-2 | §8.6.8 |
| DeviceCMYK è lo spazio colore di processo sottrattivo a quattro componenti. | ISO 32000-2 | §8.6.4.4 |
| Uno spazio colore Separation nomina un colorante la cui tinta si mappa su uno spazio alternativo tramite una tint-transform. | ISO 32000-2 | §8.6.6.4 |
Uno spazio colore ICCBased incorpora uno stream di profilo ICC con un conteggio di componenti /N. | ISO 32000-2 | §8.6.5.5 |
Un output intent dichiara la condizione di produzione di destinazione; GTS_PDFX nomina il sottotipo di stampa. | ISO 32000-2 | §14.11.5 |
Profilo di riproducibilità — structural. L’emissione del colore non ha entropia propria, ma ogni documento salvato porta un /ID di trailer e atomi di data, e uno stream ICC incorporato è stabile a livello di byte soltanto per un profilo incluso fisso. L’affermazione supportata è l’uguaglianza strutturale dopo la normalizzazione con qpdf. Questa ricetta descrive come NextPDF produce la struttura; non asserisce una conformità ISO 32000-2 generalizzata.
Contesto commerciale
Sezione intitolata “Contesto commerciale”Non applicabile. Il CMYK di dispositivo, il colore spot/Separation e la dichiarazione dell’output intent sono funzionalità di Core senza alcun gate Premium. Core supporta la dichiarazione di output intent RGB inclusa mostrata qui; i workflow ICC personalizzati per condizione di stampa CMYK non sono rivendicati da questa ricetta.