Druckfertige CMYK- und Schmuckfarben erzeugen
Auf einen Blick
Abschnitt betitelt „Auf einen Blick“Bildschirmfarbe ist RGB. Druckfarbe ist es nicht. Wenn eine Druckmaschine oder ein Proofing-RIP Ihr PDF verarbeitet, will es Prozessfarben (CMYK), gelegentlich eine benannte Druckfarbe (eine Schmuck- oder Separation-Farbe) und eine Deklaration der Produktionsbedingung, die es annehmen soll. Dieses Recipe zeigt die drei Farbausgabe-Pfade, die NextPDF Ihnen für dieses Publikum gibt:
- Device-CMYK-Füllungen und -Striche –
setFillColorCmyk()/setDrawColorCmyk(). - Schmuck-/Separation-Druckfarben mit einem Tonwert –
registerSpotColor(), dannsetSpotFillColor()/setSpotDrawColor(). - Ein ICC-Output-Intent, das eine RGB-Arbeits-/Ausgabebedingung für das gesamte Dokument deklariert –
Config::withOutputColorProfile(). Die mitgelieferten Profile sind RGB-Arbeitsfarbräume; dies deklariert keine echte CMYK-Druckmaschinen- / PDF/X-Druckbedingung.
Vorab eine Anmerkung zum Geltungsbereich: Hier geht es um Farbausgabe. NextPDF schreibt die CMYK-Werte, den Separation-Farbraum und die angeforderte Output-Intent-Deklaration. Es führt keine Farbmanagement-Transformation aus – es rendert Ihre RGB-Grafik nicht in einen Ziel-CMYK-Gamut um, führt kein Soft-Proofing durch und garantiert keine visuelle Übereinstimmung. Liefern Sie Farben, die bereits für Ihre Bedingung spezifiziert sind.
Installation
Abschnitt betitelt „Installation“composer require nextpdf/core:^3Keine optionale Erweiterung ist erforderlich. Die Farb-API ist seit 1.2.0 stabil und läuft auf der 8.1–8.4-Backport-Matrix.
Device-CMYK-Füllungen und -Striche
Abschnitt betitelt „Device-CMYK-Füllungen und -Striche“CMYK ist der Standard für Offset- und digitalen Prozessdruck: vier Kanäle, Cyan / Magenta / Gelb / Schwarz (der „Key“). Setzen Sie die Füll- oder Strichfarbe und zeichnen Sie dann wie gewohnt.
<?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');Jeder Aufruf gibt einen DeviceCMYK-Farboperator in den Content-Stream aus: k für die nicht-zeichnende (Füll-/Text-)Farbe und K für die zeichnende Farbe, mit den vier auf den intern von PDF verwendeten Bereich 0.0–1.0 skalierten Komponenten. ISO 32000-2 §8.6.8 (Colour Operators, Table 73) definiert k und K als die DeviceCMYK-Farbsetz-Operatoren; §8.6.4.4 definiert den DeviceCMYK-Farbraum selbst.
Das zugrunde liegende Wertobjekt ist NextPDF\Graphics\Color. Wenn Sie Farben direkt bauen, nimmt Color::cmyk($c, $m, $y, $k) dieselben 0–100-Prozentsätze entgegen und ist das, was jede …Cmyk-Dokumentmethode aufruft.
Schmuck-/Separation-Druckfarben mit einem Tonwert
Abschnitt betitelt „Schmuck-/Separation-Druckfarben mit einem Tonwert“Eine Schmuckfarbe ist eine einzelne benannte Druckfarbe – ein Pantone, ein HKS, ein Lack, eine Stanz-„Cut“-Platte –, die die Druckmaschine als eigene Platte lädt, statt sie aus Prozessfarben aufzubauen. In PDF ist es ein Separation-Farbraum: ein Farbmittelname plus ein alternativer Raum (hier DeviceCMYK) und eine Tint-Transform, die einen Tonwert in [0, 1] auf den alternativen Raum abbildet, sodass Renderer ohne Schmuckfarbenunterstützung dennoch eine Annäherung zeigen.
Registrieren Sie die Druckfarbe einmal mit ihrem CMYK-Fallback und setzen Sie sie dann als Füll- oder Strichfarbe mit einem Tonwert-Prozentsatz:
<?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');Sie müssen registerSpotColor() aufrufen, bevor Sie sie auswählen; ein nicht registrierter Name wirft eine PageLayoutException. Die Registrierung schreibt die Separation-Ressource und die Tint-Transform; setSpotFillColor() / setSpotDrawColor() geben dann /CS_<token> cs <tint> scn für eine Füllung aus (oder die zeichnende Großbuchstabenform /CS_<token> CS <tint> SCN) gegen diese registrierte Separation-Ressource. Hier sind zwei verschiedene Namen im Spiel, und die Engine behandelt sie getrennt:
- Der Ressourcen-SCHLÜSSEL – das
/CS_…-Token, das der Content-Stream-Operator referenziert und unter dem das/Resources /ColorSpace-Dictionary der Seite verschlüsselt ist – wird aus dem Druckfarbennamen abgeleitet, indem jedes Nicht-Wort-Zeichen durch_ersetzt wird, sodass'PANTONE 485 C'die Ressource/CS_PANTONE_485_Causwählt. (Für Druckfarbennamen, die einen wörtlichen_, einen Bindestrich oder andere Interpunktion enthalten, wird ein kurzes deterministisches Suffix angehängt, um den Schlüssel kollisionsfrei zu halten, sodass zwei nahezu identische Namen niemals einen Farbraum teilen.) - Der Separation-Farbmittelname selbst – der Name, der innerhalb des Farbraum-Arrays
[/Separation /<name> …]getragen wird – wird unverändert beibehalten und vom Writer als PDF-Name-Objekt codiert, wobei jedes Trennzeichen oder nicht-druckende Byte hexadezimal escapt wird (#XX). Er wird nicht auf dasCS_…-Token reduziert; der Ressourcenschlüssel und der Farbmittelname werden unabhängig berechnet.
Das übergebene Tint-Argument ist ein Prozentsatz, 0 (Papier) bis 100 (volle Druckfarbe), aber der in den Content-Stream geschriebene Operand ist der normalisierte Wert 0.0–1.0, sodass ein Tonwert von 40 /CS_PANTONE_485_C cs 0.400000 scn ausgibt. ISO 32000-2 §8.6.6.4 behandelt Separation-Farbräume und ihre Tint-Transform.
Die voreingestellte Tint-Transform ist eine lineare Interpolation von [0 0 0 0] (Papier bei Tonwert 0) zum registrierten CMYK-Fallback (volle Druckfarbe bei Tonwert 1). Das ist für gewöhnliche Schmuckfarben korrekt; eine nicht-lineare Druckfarbe oder ein gemessenes Profil benötigt eine eigene Transform, die über dieses Recipe hinausgeht.
Ein ICC-Output-Intent deklarieren
Abschnitt betitelt „Ein ICC-Output-Intent deklarieren“Ein PDF kann eine dokumentweite Deklaration der Farbbedingung tragen, für die seine Farben vorbereitet wurden – ein Output-Intent: ein Dictionary, das die Produktionsbedingung benennt, mit dem als ICCBased-Stream eingebetteten Ziel-ICC-Profil. In einem echten Druck-/PDF-X-Workflow ist dies eine CMYK-Druckmaschinenbedingung (zum Beispiel ein gestrichenes FOGRA- oder GRACoL-Profil). Die Profile, die NextPDF mitliefert, sind jedoch RGB-Arbeitsfarbräume – das, was Config::withOutputColorProfile() deklariert, ist also eine RGB-Betrachtungs-/Arbeitsfarbraum-Ausgabebedingung, kein CMYK-Ziel. Lesen Sie den Hinweis unter dem Beispiel, bevor Sie sich für die Druckausgabe darauf verlassen.
NextPDF stellt dies über die Dokument-Config bereit. Wählen Sie eines der mitgelieferten Arbeitsfarbraum-Profile, bauen Sie die Config und erstellen Sie das Dokument daraus:
<?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 ist ein Enum von Arbeitsfarbräumen, für die die Engine ein Profil mitliefert. Alle profilgestützten Fälle sind dreikomponentige RGB-Arbeitsfarbräume; DeviceRGB ist der Standard-Sentinel und gibt kein Output-Intent aus. Es gibt kein mitgeliefertes CMYK-Zielprofil:
DeviceRGB– der Standard. Kein Output-Intent wird ausgegeben: keine PDF-Ebene-Ausgabebedingung wird deklariert, und die PDF/A-Pipeline (falls aktiv) behält die alleinige Kontrolle über das/OutputIntents-Array. Verwenden Sie dies, wenn Sie keines deklarieren möchten. (PDF-DeviceRGB-Inhalt ohne Output-Intent ist geräteabhängig – es ist kein deklariertes sRGB.)Srgb– gibt ein Output-Intent-Dictionary aus, das das mitgeliefertesRGB.icceinbettet, mit dem Standard-BedingungsbezeichnersRGB IEC61966-2.1.DisplayP3,Rec2020,A98RGB,ProphotoRGB– RGB-Arbeitsfarbräume mit weitem Gamut, jeweils mit ihrem mitgelieferten ICC-Profil eingebettet unter einem eigenen (NextPDF wide-gamut …-)Bedingungsbezeichner.
Jeder Fall außer DeviceRGB veranlasst den Writer, ein Output-Intent-Dictionary auszugeben, das den eingebetteten ICCBased-Stream referenziert (mit seinem /N 3-Komponentenzähler). ISO 32000-2 §14.11.5 definiert das Output-Intent-Dictionary; §8.6.5.5 definiert den ICCBased-Farbraum, der das eingebettete Profil trägt. In der aktuellen Engine wird dieses Dictionary unabhängig vom gewählten mitgelieferten Profil mit dem PDF/X-Output-Intent-Subtyp /GTS_PDFX geschrieben (der PDF/A-Archivierungspfad verwendet seinen eigenen /GTS_PDFA1-Subtyp und wird separat ausgegeben).
Der wichtige Vorbehalt: Weil alle mitgelieferten Profile RGB sind, deklariert dies den RGB-Arbeitsfarbraum und die Betrachtungsabsicht des Dokuments – es ist kein CMYK-Zielprofil, und es transformiert nichts in CMYK. Die Engine lässt Sie kein eigenes CMYK-Zielprofil über withOutputColorProfile() liefern. Ein echtes Druck-/PDF-X-CMYK-Output-Intent erfordert einen Workflow, der Ihr eigenes CMYK-ICC-Profil als Ziel einbettet; für ein Archivierungs-Output-Intent, das in dasselbe /OutputIntents-Array verdrahtet ist, siehe PDF/A-4-Ausgabe.
Wann Sie zu welchem greifen
Abschnitt betitelt „Wann Sie zu welchem greifen“- Device-CMYK – der Standard für jede Grafik, die für eine Prozessdruckmaschine bestimmt ist. Spezifizieren Sie Ihre Farben von Anfang an in CMYK, damit kein RGB→CMYK-Rätselraten weiter unten geschieht.
- Schmuck-/Separation – Markenfarben, die eine exakte Druckfarbe treffen müssen, plus Nicht-Prozess-Platten (Lack, Weiß, Metallic, Stanzung, Folie). Einmal registrieren, mit beliebigem Tonwert auftragen.
- Output-Intent – setzen Sie es, wenn die Datei selbstbeschreibend über ihre RGB-Arbeits-/Ausgabebedingung sein soll oder wenn ein Verbraucher (ein Viewer, ein farbverwaltetes RIP, ein Validator) eine deklarierte Ausgabebedingung erwartet. Die mitgelieferten Profile deklarieren nur eine RGB-Arbeits-/Ausgabebedingung; sie deklarieren keine echte CMYK-Druckmaschinen- / PDF/X-Druckbedingung.
Grenzfälle & Stolperfallen
Abschnitt betitelt „Grenzfälle & Stolperfallen“- CMYK-Komponenten sind Prozentsätze (0–100), nicht 0–1. Die
…Cmyk-Dokumentmethoden undColor::cmyk()nehmen jeden Kanal als0–100-Prozentsatz entgegen und teilen beim Schreiben des Operators durch 100; der Content-Stream-Operand ist der normalisierte Wert0.0–1.0. Übergeben Sie100für volle Druckfarbe, nicht1.0(was die Engine als 1 % Druckfarbe behandeln würde). - Registrieren Sie, bevor Sie eine Schmuckfarbe auswählen.
setSpotFillColor()/setSpotDrawColor()werfen, wenn der Name nie registriert wurde. Namen werden exakt abgeglichen, einschließlich Groß-/Kleinschreibung und Leerzeichen. - Der Farbzustand bleibt bestehen. Eine CMYK- oder Schmuckfarbe bleibt in Kraft, bis Sie sie ändern. Setzen Sie sie vor einem nicht zusammenhängenden Block zurück.
- Der CMYK-Fallback ist eine Annäherung. Die Separation-Tint-Transform existiert, damit Renderer ohne Schmuckfarbenunterstützung etwas zeigen können; sie ist nicht die Druckausgabe. Die echte Druckfarbe ist das, was die benannte Platte erzeugt.
- Ein Output-Intent ist eine Deklaration, keine Konvertierung. Das Deklarieren von
OutputColorProfile::Srgbtransformiert Ihre Farben nicht in sRGB; es gibt die beabsichtigte Bedingung an. Die Farbgenauigkeit liegt vorgelagert in Ihrer Verantwortung.
Performance
Abschnitt betitelt „Performance“Jede Farbauswahl ist ein einzelner Content-Stream-Operator; eine Schmuckfarbe schreibt zusätzlich eine Separation-Ressource pro registrierter Druckfarbe. Ein eingebettetes Output-Intent-Profil wird einmal pro Dokument geschrieben. Alle Pfade bleiben deutlich innerhalb des Budgets von 2000 ms / 64 MB.
Sicherheitshinweise
Abschnitt betitelt „Sicherheitshinweise“Dieses Recipe gibt nur die Farben und das Profil aus, die Ihr Code spezifiziert. Es parst keine nicht vertrauenswürdige Eingabe und führt keinen Netzwerkzugriff aus. Wenn Farbmittelnamen oder CMYK-Komponenten aus externen Daten stammen, validieren Sie sie: Begrenzen Sie Komponenten auf 0–100 und lehnen Sie Steuerzeichen in Schmuckfarbennamen ab (ein NUL-Byte in einem Separation-Namen wird von der Engine abgelehnt).
Konformität
Abschnitt betitelt „Konformität“| Aussage | Spec | Klausel |
|---|---|---|
k und K sind die Farboperatoren, die die nicht-zeichnende / zeichnende DeviceCMYK-Farbe setzen. | ISO 32000-2 | §8.6.8 |
| DeviceCMYK ist der subtraktive vierkomponentige Prozessfarbraum. | ISO 32000-2 | §8.6.4.4 |
| Ein Separation-Farbraum benennt ein Farbmittel, dessen Tonwert über eine Tint-Transform auf einen alternativen Raum abgebildet wird. | ISO 32000-2 | §8.6.6.4 |
Ein ICCBased-Farbraum bettet einen ICC-Profil-Stream mit einem /N-Komponentenzähler ein. | ISO 32000-2 | §8.6.5.5 |
Ein Output-Intent deklariert die Ziel-Produktionsbedingung; GTS_PDFX benennt den Druck-Subtyp. | ISO 32000-2 | §14.11.5 |
Reproduzierbarkeitsprofil – structural. Die Farbausgabe hat keine eigene Entropie, aber jedes gespeicherte Dokument trägt ein Trailer-/ID und Datumsatome, und ein eingebetteter ICC-Stream ist nur für ein festes mitgeliefertes Profil bytestabil. Der gestützte Anspruch ist strukturelle Gleichheit nach qpdf-Normalisierung. Dieses Recipe beschreibt, wie NextPDF die Struktur erzeugt; es behauptet keine pauschale ISO-32000-2-Konformität.
Kommerzieller Kontext
Abschnitt betitelt „Kommerzieller Kontext“Nicht anwendbar. Device-CMYK, Schmuck-/Separation-Farbe und die Output-Intent-Deklaration sind Core-Funktionen ohne Premium-Schranke. Core unterstützt die hier gezeigte mitgelieferte RGB-Output-Intent-Deklaration; eigene CMYK-Druckbedingungs-ICC-Workflows werden von diesem Recipe nicht beansprucht.