ConvertPdfDocumentColours čte aktivní revizi PDF, převádí původní operandy komponent a vzorky obrázků přes IPdfColourTransform a připojí konzistentní revizi do odděleného výstupního streamu
Podporuje textové a vektorové operátory fill/stroke v prostorech DeviceGray, DeviceRGB, DeviceCMYK a ICCBased, zděděné prostředky stránek, pojmenované aliasy výchozích barevných prostorů, vnořené Form XObjects a raw obrázky či obrázky s obecnými filtry s 8bitovými nebo 16bitovými komponentami
Pole obsahu sdílejí jeden parser operandů a zásobník grafického stavu s mezerou mezi streamy; q/Q, výchozí barevné prostory a počty komponent zůstávají během konverze vázané na původní zdrojové prostory
Operandy CMYK pocházejí z obsahu PDF a obrazových streamů, nikdy z getterů vykresleného RGB; pro zdroje DeviceCMYK bez profilu zadejte DeviceCMYKProfile
Zdrojové profily ICCBased se hledají v jejich původním rozsahu prostředků; podporováno je pouze chybějící nebo výchozí /Range [0 1 ...], zatímco obrazová pole /Decode se aplikují před konverzí a z převedeného obrázku odstraní
Obrázky zachovávají big-endian pořadí PDF pro 16bitové vzorky; přesná bajtová geometrie a rozšíření cíle se kontrolují před alokací vzorků, nevytváří se žádný umělý stride ani padding
PreserveAllSpotColours má výchozí hodnotu true; jinak naplňte PreservedSpotColours dekódovanými názvy kolorantů PDF. Prostor Separation nebo DeviceN se zachová jen tehdy, když jsou vybrané všechny uvedené koloranty
Zachované operátory přímých barev, tint funkce a prostředky zůstanou beze změny; nevybrané přímé barvy vyžadují zvláštní backend konverze a hlásí se jako nepodporované
Obrazové stencil masky a odkazovaná data masek zůstanou beze změny; color-key masky, explicitní masky a matte komponenty soft mask vyžadují samostatná pravidla
Mezi nepodporované případy patří obrázky DCT/JPX bez dekodéru původních komponent, 1/2/4bitové obrázky a padding jejich řádků, nevýchozí rozsahy ICC, prostory Indexed/Cal/Lab/Pattern, inline obrázky, shading funkce, programy glyphů Type3, barvy ve slovnících anotací, instrukce výchozího appearance formulářů, barevný obsah XFA, transparency groups, blending jiný než normal, overprint a grafické transfer funkce nebo rendering intents
Form s vlastními prostředky musí určit barevný prostor před samotnými operandy sc/scn; sdílené Form či obrázky s odlišným zděděným zdrojovým kontextem se hlásí jako nepodporované a cachované chyby se přenášejí do každého volajícího rozsahu
FailOnUnsupported má výchozí hodnotu true a při chybě zachovává cíl; false dovolí nezávislé podporované změny, nastaví Complete na false a u částečné konverze nikdy nezapíše nový OutputIntent
Částečný výsledek může zachovat existující OutputIntent ze zdroje; OutputIntentWritten výslovně hlásí, zda tato operace nainstalovala nové cílové prohlášení
Kompletní výsledek vloží dodaný cílový ICC profil a zapíše OutputIntent s požadovaným identifikátorem; tím se nepotvrzuje PDF/X, PDF/A ani jiná úroveň shody
Zdroj a cíl musí být různé streamy; pozice zdroje se obnoví, chyby přípravy ponechají cíl beze změny a zrušení zachová EPdfOperationCancelled
Publikování připraveného výsledku nahradí cíl prostřednictvím jeho stream API; výjimka při zkracování či zápisu cíle může zanechat částečný výstup. Pokud potřebujete atomické publikování souboru, zapisujte do dočasného souboru a po úspěchu ho přejmenujte
Šifrování a existující podpisy vyžadují samostatně připravený nešifrovaný, nepodepsaný zdroj; inkrementální konverze barev nezachovává platnost podpisů
Výchozí limity dovolují 64 MiB na dekódovaný stream obsahu/obrázku, 512 MiB pro staging výstupu, 10,000 reportů problémů a hloubku 64, navíc k rozpočtům čtečky aktivních objektů
Výstupní rozpočet konzervativně zahrnuje zdrojové bajty, připravené náhradní objekty a rezervovanou režii xref/trailer před přidáním každé změny; před serializací se započte úplná délka traileru a omezený výstupní stream odmítne zápisy nad limitem před zvětšením své logické velikosti
Tím se omezuje logický staging výstupu, nikoli veškerá paměť procesu či zaokrouhlování kapacity alokátorem; výsledná serializovaná velikost se před publikováním znovu kontroluje
Skutečná konverze obrázků RGB, CMYK a ICCBased, textu/vektorů, vnořených Form, zachování Separation a DeviceN, OutputIntent, komprimované object streamy a uložení/opětovné otevření/vykreslení PDF jsou ověřené v Delphi i FPC na Win32 a Win64
ProviderOptions := TPdfLittleCmsOptions.Default; Provider := CreatePdfLittleCmsColourTransform(LibraryPath, ProviderOptions); Options := TPdfDocumentColourOptions.Default; Options.DeviceCMYKProfile := SourceCmykProfile; TargetProfile := CreatePdfLittleCmsGrayProfile(LibraryPath); if not ConvertPdfDocumentColours(Source, Destination, pcsDeviceGray, TargetProfile, Provider, Options, Report, CancellationToken) then raise Exception.Create(Report.ErrorText);
type
TPdfSpotColourNames = array of AnsiString;
TPdfDocumentColourOptions = record
ReadOptions: TPdfActiveObjectReadOptions;
MaxDecodedStreamBytes: Integer;
MaxOutputBytes: Int64;
MaxIssues: Integer;
MaxDepth: Integer;
FailOnUnsupported: Boolean;
PreserveAllSpotColours: Boolean;
PreservedSpotColours: TPdfSpotColourNames;
DeviceGrayProfile, DeviceRGBProfile, DeviceCMYKProfile: TBytes;
OutputIntentIdentifier: string;
class function Default: TPdfDocumentColourOptions; static;
end;
TPdfDocumentColourIssue = record
ObjectNumber: Integer;
Reason: string;
end;
TPdfDocumentColourIssues = array of TPdfDocumentColourIssue;
TPdfDocumentColourReport = record
Succeeded: Boolean;
Complete: Boolean;
ContentStreamsConverted, FormsConverted, ImagesConverted: Integer;
ColourOperatorsConverted, PreservedSpotSelections, PreservedMasks: Integer;
UnsupportedCount: Integer;
OutputIntentWritten: Boolean;
Issues: TPdfDocumentColourIssues;
ErrorText: string;
end;
function ConvertPdfDocumentColours(Source, Destination: TStream;
TargetSpace: TPdfColourSpace; const TargetProfile: TBytes;
Transform: IPdfColourTransform; const Options: TPdfDocumentColourOptions;
out Report: TPdfDocumentColourReport;
CancellationToken: IPdfCancellationToken = nil): Boolean;