Ga naar inhoud
getnextpdf.com

Drukklare CMYK- en spotkleur produceren

Schermkleur is RGB. Drukkleur is dat niet. Wanneer een pers of een proofing-RIP je PDF verwerkt, wil die proces-inkten (CMYK), af en toe een benoemde inkt (een spot- of Separation-kleur) en een declaratie van de productiecondition die hij moet aannemen. Dit recipe toont de drie kleuruitzendpaden die NextPDF je voor dat publiek geeft:

  • Device CMYK-vullingen en -strokes — setFillColorCmyk() / setDrawColorCmyk().
  • Spot- / Separation-inkten op een tint — registerSpotColor() gevolgd door setSpotFillColor() / setSpotDrawColor().
  • Een ICC-output-intent die een RGB-werk-/uitvoercondition voor het hele document declareert — Config::withOutputColorProfile(). De meegeleverde profielen zijn RGB-werkruimten; dit declareert geen echte CMYK-pers- / PDF/X-drukcondition.

Een scope-kanttekening vooraf: dit is kleuruitzending. NextPDF schrijft de CMYK-getallen, de Separation-ruimte en de output-intent-declaratie die je vraagt. Het draait geen kleurbeheertransformatie — het zal je RGB-artwork niet opnieuw renderen naar een doel-CMYK-gamut, het niet soft-proofen of een visuele match garanderen. Lever kleuren aan die al voor je condition zijn gespecificeerd.

Terminal window
composer require nextpdf/core:^3

Er is geen optionele extensie vereist. De kleur-API is stabiel sinds 1.2.0 en draait op de 8.1–8.4-backportmatrix.

CMYK is de standaard voor offset- en digitale procesdruk: vier kanalen, cyaan / magenta / geel / zwart (de “key”). Stel de vul- of strokekleur in en teken vervolgens zoals gebruikelijk.

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

Elke aanroep zendt een DeviceCMYK-kleuroperator in de content stream uit: k voor de niet-strokende (vul/tekst) kleur en K voor de strokende kleur, met de vier componenten geschaald naar het 0.0–1.0-bereik dat PDF intern gebruikt. ISO 32000-2 §8.6.8 (Colour Operators, Table 73) definieert k en K als de DeviceCMYK-kleurinstellingsoperatoren; §8.6.4.4 definieert de DeviceCMYK-kleurruimte zelf.

Het onderliggende waardeobject is NextPDF\Graphics\Color. Als je kleuren direct bouwt, neemt Color::cmyk($c, $m, $y, $k) dezelfde 0–100-percentages en is het wat elke …Cmyk-documentmethode aanroept.

Een spotkleur is één benoemde inkt — een Pantone, een HKS, een vernis, een uitstans-”cut”-plaat — die de pers als eigen plaat laadt in plaats van uit proces-inkten op te bouwen. In PDF is het een Separation-kleurruimte: een kleurmiddelnaam plus een alternatieve ruimte (hier DeviceCMYK) en een tint-transform die een tintwaarde in [0, 1] op de alternatieve ruimte afbeeldt, zodat niet-spot-renderers toch een benadering tonen.

Registreer de inkt eenmaal met zijn CMYK-fallback, en stel die dan in als vul- of strokekleur op een tintpercentage:

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

Je moet registerSpotColor() aanroepen voordat je het selecteert; een niet-geregistreerde naam werpt een PageLayoutException op. Registratie schrijft de Separation-resource en tint-transform; setSpotFillColor() / setSpotDrawColor() zenden vervolgens /CS_<token> cs <tint> scn uit voor een vulling (of de strokende vorm in hoofdletters /CS_<token> CS <tint> SCN) tegen die geregistreerde Separation-resource. Hier spelen twee verschillende namen een rol, en de engine behandelt ze afzonderlijk:

  • De resource-KEY — het /CS_…-token waarnaar de content-stream-operator verwijst en waaronder de /Resources /ColorSpace-dictionary van de pagina is gesleuteld — wordt afgeleid van de inktnaam door elk niet-woordteken te vervangen door _, zodat 'PANTONE 485 C' de resource /CS_PANTONE_485_C selecteert. (Voor inktnamen die een letterlijke _, een koppelteken of andere interpunctie bevatten, wordt een korte deterministische suffix toegevoegd om de key botsingvrij te houden, zodat twee vrijwel identieke namen nooit één kleurruimte delen.)
  • De Separation-kleurmiddelnaam zelf — de naam die binnen de [/Separation /<name> …]-kleurruimte-array wordt gedragen — wordt as-is behouden en door de writer gecodeerd als een PDF-naamobject, waarbij elke delimiter of niet-afdrukbare byte hex-escaped wordt (#XX). Het wordt niet afgevlakt naar het CS_…-token; de resource-key en de kleurmiddelnaam worden onafhankelijk berekend.

Het tintargument dat je doorgeeft is een percentage, 0 (papier) tot 100 (volle inkt), maar de operand die in de content stream wordt geschreven is de genormaliseerde 0.0–1.0-waarde, dus een 40-tint zendt /CS_PANTONE_485_C cs 0.400000 scn uit. ISO 32000-2 §8.6.6.4 behandelt Separation-kleurruimten en hun tint-transform.

De standaard tint-transform is een lineaire interpolatie van [0 0 0 0] (papier op tint 0) naar de geregistreerde CMYK-fallback (volle inkt op tint 1). Dat is correct voor gewone spot-inkten; een niet-lineaire inkt of een gemeten profiel vereist een aangepaste transform, wat buiten dit recipe valt.

PDF kan een document-niveau-declaratie dragen van de kleurcondition waarvoor zijn kleuren zijn voorbereid — een output-intent: een dictionary die de productiecondition benoemt, met het doel-ICC-profiel ingesloten als een ICCBased-stream. In een echte druk-/PDF-X-workflow is dit een CMYK-perscondition (een coated FOGRA- of GRACoL-profiel, bijvoorbeeld). De profielen die NextPDF meelevert zijn echter RGB-werkruimten — dus wat Config::withOutputColorProfile() declareert is een RGB-bekijk- / werkruimte-uitvoercondition, geen CMYK-doel. Zie de notitie onder het voorbeeld voordat je erop vertrouwt voor drukuitvoer.

NextPDF stelt dit beschikbaar via de document-Config. Kies een van de meegeleverde werkruimteprofielen, bouw de config en maak het document daaruit:

<?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 is een enum van werkruimten waarvoor de engine een profiel meelevert. Alle profiel-ondersteunde cases zijn drie-componenten RGB-werkruimten; DeviceRGB is de standaard sentinel en zendt geen output-intent uit. Er is geen meegeleverd CMYK-doelprofiel:

  • DeviceRGB — de standaard. Er wordt geen output-intent uitgezonden: er wordt geen PDF-niveau-uitvoercondition gedeclareerd, en de PDF/A-pijplijn (indien actief) behoudt exclusieve controle over de /OutputIntents-array. Gebruik dit wanneer je er geen wilt declareren. (PDF DeviceRGB-inhoud zonder output-intent is apparaatafhankelijk — het is geen gedeclareerde sRGB.)
  • Srgb — zendt een output-intent-dictionary uit die de meegeleverde sRGB.icc insluit, met de standaard condition-identifier sRGB IEC61966-2.1.
  • DisplayP3, Rec2020, A98RGB, ProphotoRGB — wide-gamut RGB-werkruimten, elk met zijn meegeleverde ICC-profiel ingesloten onder een aangepaste (NextPDF wide-gamut …) condition-identifier.

Elke case anders dan DeviceRGB zorgt dat de writer een output-intent-dictionary uitzendt die verwijst naar de ingesloten ICCBased-stream (met zijn /N 3-componentaantal). ISO 32000-2 §14.11.5 definieert de output-intent-dictionary; §8.6.5.5 definieert de ICCBased-kleurruimte die het ingesloten profiel draagt. In de huidige engine wordt deze dictionary geschreven met het PDF/X-output-intent-subtype /GTS_PDFX ongeacht welk meegeleverd profiel je kiest (het PDF/A-archiveringspad gebruikt zijn eigen /GTS_PDFA1-subtype en wordt apart uitgezonden).

De belangrijke kanttekening: omdat alle meegeleverde profielen RGB zijn, declareert dit de RGB-werkruimte en bekijkintentie van het document — het is geen CMYK-doelprofiel, en het transformeert niets naar CMYK. De engine staat je niet toe een aangepast CMYK-doel-ICC te leveren via withOutputColorProfile(). Een echte druk-/PDF-X-CMYK-output-intent vereist een workflow die je eigen CMYK-ICC-profiel als doel insluit; voor een archiverings-output-intent die in dezelfde /OutputIntents-array is bedraad, zie PDF/A-4-uitvoer.

  • Device CMYK — de standaard voor elk artwork bestemd voor een procespers. Specificeer je kleuren vanaf het begin in CMYK zodat er stroomafwaarts geen RGB→CMYK-giswerk gebeurt.
  • Spot / Separation — merkkleuren die een exacte inkt moeten raken, plus niet-proces-platen (vernis, wit, metallic, uitstans, folie). Registreer eenmaal, schilder op elke tint.
  • Output-intent — stel het in wanneer je wilt dat het bestand zelfbeschrijvend is over zijn RGB-werk-/uitvoercondition, of wanneer een verwerker (een viewer, een kleurbeheerde RIP, een validator) een gedeclareerde uitvoercondition verwacht. De meegeleverde profielen declareren alleen een RGB-werk-/uitvoercondition; ze declareren geen echte CMYK-pers- / PDF/X-drukcondition.
  • CMYK-componenten zijn percentages (0–100), geen 0–1. De …Cmyk-documentmethoden en Color::cmyk() nemen elk kanaal als een 0–100-percentage en delen door 100 bij het schrijven van de operator; de content-stream-operand is de genormaliseerde 0.0–1.0-waarde. Geef 100 door voor volle inkt, niet 1.0 (dat de engine als 1% inkt zou behandelen).
  • Registreer voordat je een spot selecteert. setSpotFillColor() / setSpotDrawColor() werpen op als de naam nooit is geregistreerd. Namen worden exact gematcht, inclusief hoofdletters en spaties.
  • Kleurstaat blijft bestaan. Een CMYK- of spotkleur blijft van kracht totdat je die verandert. Reset vóór een ongerelateerd blok.
  • De CMYK-fallback is een benadering. De Separation-tint-transform bestaat zodat niet-spot-renderers iets kunnen tonen; het is niet de persuitvoer. De echte inkt is wat de benoemde plaat produceert.
  • Een output-intent is een declaratie, geen conversie. Het declareren van OutputColorProfile::Srgb transformeert je kleuren niet naar sRGB; het verklaart de bedoelde condition. Kleurnauwkeurigheid is stroomopwaarts jouw verantwoordelijkheid.

Elke kleurselectie is één content-stream-operator; een spot schrijft ook één Separation-resource per geregistreerde inkt. Een ingesloten output-intent-profiel wordt eenmaal per document geschreven. Alle paden blijven ruim binnen het budget van 2000 ms / 64 MB.

Dit recipe zendt alleen de kleuren en het profiel uit die je code specificeert. Het parset geen niet-vertrouwde invoer en maakt geen netwerktoegang. Als kleurmiddelnamen of CMYK-componenten uit externe gegevens komen, valideer ze dan: clamp componenten naar 0–100 en weiger stuurtekens in spotnamen (een NUL-byte in een Separation-naam wordt door de engine geweigerd).

VerklaringSpecClause
k en K zijn de kleuroperatoren die de DeviceCMYK niet-strokende / strokende kleur instellen.ISO 32000-2§8.6.8
DeviceCMYK is de subtractieve vier-componenten proceskleurruimte.ISO 32000-2§8.6.4.4
Een Separation-kleurruimte benoemt één kleurmiddel waarvan de tint via een tint-transform op een alternatieve ruimte wordt afgebeeld.ISO 32000-2§8.6.6.4
Een ICCBased-kleurruimte sluit een ICC-profielstream in met een /N-componentaantal.ISO 32000-2§8.6.5.5
Een output-intent declareert de doel-productiecondition; GTS_PDFX benoemt het druk-subtype.ISO 32000-2§14.11.5

Reproduceerbaarheidsprofiel — structureel. Kleuruitzending heeft geen eigen entropie, maar elk opgeslagen document draagt een trailer-/ID en datum-atomen, en een ingesloten ICC-stream is alleen byte-stabiel voor een vast meegeleverd profiel. De ondersteunde claim is structurele gelijkheid na qpdf-normalisatie. Dit recipe beschrijft hoe NextPDF de structuur produceert; het beweert geen pauschale ISO 32000-2-conformiteit.

Niet van toepassing. Device CMYK, spot-/Separation-kleur en de output-intent-declaratie zijn Core-capaciteiten zonder Premium-gate. Core ondersteunt de hier getoonde meegeleverde RGB-output-intent-declaratie; aangepaste CMYK-drukcondition-ICC-workflows worden door dit recipe niet geclaimd.