RecolorDocument flyttar en hel PDF till en färgrymd, och RecolorPage gör samma sak för en enda sida. Båda tar 1 för gråskala, 2 för RGB och 3 för CMYK, och returnerar hur många färger som konverterades. Geometri, text och bilder stannar exakt där de var; bara färgen ändras
Detta är operationen du vill ha innan du skickar arbete till ett tryckeri som förväntar sig en rymd, eller när ett färgdokument måste bli ett grått utan att återskapas. Alternativet — att bygga om dokumentet från dess källdata i målrymden — är bara tillgängligt när du fortfarande har källdata, vilket för allt mottaget utifrån du inte har
Vad som konverteras, och i vilken ordning
Färgoperatorer först: de fyllningar och streck en sida sätter medan den ritas. En färg som redan är i målrymden lämnas orörd, så en sida vars färger inte behöver ändras behåller sina ursprungliga byte i stället för att skrivas om till identiska värden. Den egenskapen betyder mer än den låter på ett stort dokument, eftersom orörda objekt förblir orörda i filen
Bilder kommer därefter, och de är den del som tidigare saknades. Ett dokument gjort grått med bara dess operatorer konverterade visade fortfarande färgbilder på gråa sidor, vilket är värre än något av extremerna. En bild konverteras när den bär åtta bitar per komponent, en enhetsfärgrymd och antingen ingen komprimering eller vanlig Flate
Indexerade bilder konverteras genom sin färgtabell: paletten konverteras och varje sampel behåller indexet den redan hade. Det täcker de palettbilder en skärmdump eller ett diagram vanligtvis sparas som, och det konverterar dem oavsett vad deras sampel är packade eller komprimerade med, eftersom sampel aldrig ändras
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;
Varför lämnas en JPEG orörd?
Eftersom att konvertera dess färger skulle betyda att koda om den, och omkodning är en annan operation med andra konsekvenser. En JPEG- eller faxbild behåller sina egna byte: avkodning, konvertering och återkomprimering skulle ändra bilddatan självt, införa en andra generation av förstörande artefakter och ändra filstorleken på sätt som anroparen inte bad om
Mjuka masker och stencilmasker lämnas orörda av en annan anledning. Båda läses som täckning i stället för som färg, och att konvertera en skulle lämna sidan som visar masken som en bild — en genomskinlighetsmask renderad som grå grafik ovanpå innehållet den skulle forma. Att lämna dem är inte en begränsning att kringgå; det är rätt resultat
Färger satta genom en ICCBased-, Separation-, Indexed- eller Pattern-rymd lämnas också som de står på operatornivå. Att konvertera dem utan att läsa deras profil skulle ändra hur sidan ser ut i stället för att bevara den, och en återfärgningspass vars hela löfte är bevarande kan inte börja gissa på profiler
Toningsgradienter konverteras med stoppen bakom dem
En toningsgradient är en färgrymd plus en funktion som producerar färger i den, och att konvertera den ena utan den andra producerar nonsens — en konverterad toningsgradient vars stopp lämnades bakom läses som en kanal misstagen för en grånivå, vilket på en sida ser ut som ett band av helt fel färg. Toningsgradientens färgrymd och stoppen bakom den flyttas tillsammans
Toningsgradienter hittas var de än bor: givna ett objekt av sitt eget, skrivna inuti det mönster som målar dem, eller sittande i en sidas skuggningsresurser. Den täckningen betyder något eftersom designverktyg distribuerar dem olika, och en konverterare som bara hanterade en placering skulle lämna ett dokument halvt konverterat utan uppenbart mönster i felen
Två slag lämnas avsiktligt som de står. En toningsgradient byggd från en samplad eller PostScript-funktion behåller sin egen definition, och det gör också mesh-typerna, som bär sina färger i en ström i stället för i en funktion. Att skriva om någon av dem är en annan operation än att konvertera en färg, och att göra det tyst inuti en återfärgningspass skulle vara en överraskning
// 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');
Var återfärgning passar före ett tryck submitting
Använd det som ett normaliseringssteg, inte som färghantering. Återfärgning konverterar värden mellan enhetsrymder; det tillämpar inte en ICC-profil, respekterar inte en återgivningsavsikt och simulerar inte ett tryckvillkor. För ett jobb som måste träffa ett kontraktskorrekt är den profil-drivna arbetsflödet svaret och återfärgning är högst steget som får allt till en rymd först
Där det tjänar sin plats är det vanliga produktionsproblemet: en inlämning som måste vara grå och anländer med en RGB-logotyp, ett internt dokument som inte får skrivas ut i färg, en batch filer som måste vara en rymd innan ett preflight-steg accepterar dem. Para det med en kontroll — noterna om PDF/A- och PDF/UA-preflight och om efterlevnads- och signeringsarbetsstationen täcker att köra utslaget som del av samma jobb
Om dokumentet dessutom behöver sin vektorgrafik undersökt i stället för konverterad, täcker genomgången av vektorgrafik, skuggningar och toningsgradienter hur dessa objekt är byggda från första början, vilket är användbar kontext för att förstå vad en återfärgningspass kan och inte kan nå
PDFlibPas är ett inbyggt Pascal PDF-bibliotek för Delphi, C++Builder och Lazarus utan extern runtime, så ett färgnormaliseringssteg körs inuti din egen tjänst i stället för att skala ut till en konverterare — se PDFlibPas produktsida för hela dokumentbehandlings-API:et