PDFium Delphi Component Docs

Převod barev dokumentu s ICC

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

Příklad

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

Veřejné deklarace

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;