RecolorDocument brengt een hele PDF naar één kleurruimte, en RecolorPage doet hetzelfde voor één pagina. Beide nemen 1 voor grijstinten, 2 voor RGB en 3 voor CMYK, en retourneren hoeveel kleuren zijn omgezet. Geometrie, tekst en afbeeldingen blijven precies waar ze waren; alleen de kleur verandert
Dit is de operatie die je wilt vóór het versturen van werk naar een drukpers die één ruimte verwacht, of wanneer een kleurendocument een grijswaardenversie moet worden zonder opnieuw te worden gegenereerd. Het alternatief — het document herbouwen vanuit zijn brongegevens in de doelruimte — is alleen beschikbaar wanneer je de brongegevens nog hebt, wat voor alles wat van buiten komt niet zo is
Wat wordt omgezet, en in welke volgorde
Eerst de kleuroperatoren: de vullingen en streken die een pagina tijdens het tekenen instelt. Een kleur die al in de doelruimte staat wordt met rust gelaten, zodat een pagina waarvan de kleuren geen wijziging nodig hebben zijn oorspronkelijke bytes behoudt in plaats van te worden herschreven naar identieke waarden. Die eigenschap telt zwaarder dan ze klinkt op een groot document, want onaangeroerde objecten blijven onaangeroerd in het bestand
Daarna komen afbeeldingen, en dat is het onderdeel dat vroeger ontbrak. Een document dat naar grijstinten werd gebracht met alleen de operatoren omgezet, toonde nog steeds kleurafbeeldingen op grijze pagina's, wat erger is dan elk van de uitersten afzonderlijk. Een afbeelding wordt omgezet wanneer deze acht bits per component meedraagt, een device-kleurruimte en ofwel geen compressie of gewone Flate
Geïndexeerde afbeeldingen zetten om via hun kleurentabel: het palet wordt omgezet en elke sample behoudt de index die hij al had. Dat dekt de paletafbeeldingen waarvan een screenshot of een grafiek meestal wordt opgeslagen, en het zet ze om ongeacht hoe hun samples zijn gepakt of gecomprimeerd, omdat de samples nooit veranderen
var
Lib: TPDFlib;
Converted: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.LoadFromFile('brochure.pdf', '');
Converted := Lib.RecolorDocument(1); // 1 grey, 2 RGB, 3 CMYK
Log(Format('%d colours converted', [Converted]));
Lib.SaveToFile('brochure-grey.pdf');
finally
Lib.Free;
end;
end;
Waarom wordt een JPEG met rust gelaten?
Omdat het omzetten van zijn kleuren zou betekenen dat hij opnieuw wordt gecodeerd, en hercoderen is een andere operatie met andere gevolgen. Een JPEG- of faxafbeelding behoudt zijn eigen bytes: decoderen, omzetten en hercomprimeren zou de afbeeldingsdata zelf wijzigen, een tweede generatie verliesartefacten introduceren en de bestandsgrootte veranderen op manieren die de aanroeper niet vroeg
Soft masks en stencil masks worden om een andere reden met rust gelaten. Beide worden gelezen als dekking in plaats van als kleur, en er een omzetten zou de pagina de mask als een afbeelding laten tonen — een transparantiemask gerenderd als grijze artwork bovenop de content die het zou vormen. Ze laten staan is geen beperking om omheen te werken; het is het juiste resultaat
Kleuren die via een ICCBased-, Separation-, Indexed- of Pattern-ruimte worden ingesteld, worden ook op operatorniveau met rust gelaten. Ze omzetten zonder hun profiel te lezen zou veranderen hoe de pagina eruitziet in plaats van het te behouden, en een omkleuringsoperatie waarvan de hele belofte behoud is, kan niet gaan raden naar profielen
Verlopen zetten om met de stops erachter
Een verloop is een kleurruimte plus een functie die kleuren daarin produceert, en het een omzetten zonder het ander levert onzin op — een omgezet verloop waarvan de stops achterwege zijn gebleven leest als een kanaal dat wordt aangezien voor een grijswaaierde, wat op een pagina leest als een band in een compleet verkeerde kleur. De kleurruimte van het verloop en de stops erachter bewegen samen
Verlopen worden gevonden waar ze ook leven: als eigen object, geschreven in het patroon dat ze verft, of zittend in de shading-resources van een pagina. Die dekking telt omdat ontwerpgereedschappen ze verschillend distribueren, en een converter die slechts één plaatsering aanpakt zou een document half omgezet achterlaten zonder een duidelijk patroon in de fouten
Twee soorten worden bewust met rust gelaten. Een verloop dat is opgebouwd uit een sampled- of PostScript-functie behoudt zijn eigen definitie, en dat geldt ook voor de mesh-typen, die hun kleuren in een stream meedragen in plaats van in een functie. Beide herschrijven is een andere operatie dan een kleur omzetten, en het stilzwijgend doen binnen een omkleuringsoperatie zou een verrassing zijn
// Convert a single page - useful when only the cover needs to change
Lib.SelectPage(1);
Lib.RecolorPage(3); // this page to CMYK
Lib.SaveToFile('cover-cmyk.pdf');
Waar omkleuren past vóór een drukopdracht
Gebruik het als een normalisatiestap, niet als kleurbeheer. Omkleuren zet waarden om tussen device-ruimten; het past geen ICC-profiel toe, eert geen rendering-intent en simuleert geen persconditie. Voor een klus die een contractproof moet raken, is de profielgestuurde workflow het antwoord en is omkleuren hooguit de stap die alles eerst in één ruimte brengt
Waar het zijn plaats verdient, is het gewone productieprobleem: een inzending die grijswaarden moet zijn en aankomt met een RGB-logo, een intern document dat niet in kleur mag worden afgedrukt, een batch bestanden die in één ruimte moeten zijn voordat een preflight-stap ze accepteert. Combineer het met een controle — de notities over PDF/A- en PDF/UA-preflight en over de compliance- en ondertekeningswerkbank behandelen het draaien van het verdict als onderdeel van dezelfde taak
Als het document ook zijn vectorartwork onderzocht moet hebben in plaats van omgezet, behandelt de doorloop van vectorgraphics, shaders en verlopen hoe die objecten in de eerste plaats worden opgebouwd, wat nuttige context is om te begrijpen wat een omkleuringsoperatie wel en niet kan raken
PDFlibPas is een native Pascal PDF-bibliotheek voor Delphi, C++Builder en Lazarus zonder externe runtime, zodat een kleurnormalisatiestap binnen je eigen service draait in plaats van uit te shellen naar een converter — zie de PDFlibPas-productpagina voor de volledige documentverwerkings-API