Zum Inhalt springen
getnextpdf.com

Druckfertige CMYK- und Schmuckfarben erzeugen

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(), dann setSpotFillColor() / 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.

Terminal-Fenster
composer require nextpdf/core:^3

Keine optionale Erweiterung ist erforderlich. Die Farb-API ist seit 1.2.0 stabil und läuft auf der 8.1–8.4-Backport-Matrix.

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.

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_C auswä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 das CS_…-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 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 mitgelieferte sRGB.icc einbettet, mit dem Standard-Bedingungsbezeichner sRGB 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.

  • 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.
  • CMYK-Komponenten sind Prozentsätze (0–100), nicht 0–1. Die …Cmyk-Dokumentmethoden und Color::cmyk() nehmen jeden Kanal als 0–100-Prozentsatz entgegen und teilen beim Schreiben des Operators durch 100; der Content-Stream-Operand ist der normalisierte Wert 0.0–1.0. Übergeben Sie 100 für volle Druckfarbe, nicht 1.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::Srgb transformiert Ihre Farben nicht in sRGB; es gibt die beabsichtigte Bedingung an. Die Farbgenauigkeit liegt vorgelagert in Ihrer Verantwortung.

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.

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).

AussageSpecKlausel
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.

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.