ConvertPdfDocumentColours leest de actieve PDF-revisie, zet originele componentoperanden en beeldsamples om via een IPdfColourTransform en voegt een coherente revisie toe aan een aparte uitvoerstream
Hij ondersteunt tekst- en vectorvul-/lijnoperatoren in DeviceGray, DeviceRGB, DeviceCMYK en ICCBased-kleurruimten, overgeërfde paginabronnen, genoemde alias-namen voor standaardkleurruimten, geneste Form XObjects en rauwe of general-filter-afbeeldingen met 8-bit of 16-bit componenten
Content-arrays delen één operandparser en één grafische statusstack met een spatie tussen streams; q/Q, standaardkleurruimten en componentaantallen blijven tijdens de conversie gekoppeld aan hun oorspronkelijke bronruimte
CMYK-operanden komen uit de PDF-content- en beeldstreams, nooit uit gerenderde RGB-getters; geef DeviceCMYKProfile op voor bronnen in DeviceCMYK zonder profiel
ICCBased-bronprofielen worden opgelost vanuit hun oorspronkelijke resourcebereik; alleen een afwezige of standaard /Range [0 1 ...] wordt ondersteund, terwijl /Decode-arrays van afbeeldingen vóór de conversie worden toegepast en uit de geconverteerde afbeelding worden verwijderd
Afbeeldingen behouden de PDF-big-endian-volgorde voor 16-bit samples; exacte bytegeometrie en doelexpansie worden gecontroleerd voordat samples worden toegewezen, en er worden geen stride- of padding-bytes verzonnen
PreserveAllSpotColours staat standaard op true; anders vul je PreservedSpotColours met gedecodeerde PDF-kleurstofnamen, en een Separation- of DeviceN-ruimte wordt alleen behouden wanneer elke opgegeven kleurstof is geselecteerd
Behouden spot-operatoren, tintfuncties en resources blijven intact; niet-geselecteerde spots vereisen een speciaal conversiebackend en worden als niet-ondersteund gemeld
Afbeeldingsstencilmaskers en gerefereerde maskerdata blijven intact; color-key-maskers, expliciete maskers en soft-mask-matticomponenten vereisen aparte policies
Niet-ondersteunde gevallen zijn onder andere DCT/JPX-afbeeldingen zonder decoder voor de oorspronkelijke componenten, 1/2/4-bit afbeeldingen en hun rijpadding, niet-standaard ICC-bereiken, Indexed/Cal/Lab/Pattern-ruimten, inline afbeeldingen, shading-functies, Type3-glyphprogramma's, annotatie-dictionarykleuren, instructies voor default appearance van formulieren, XFA-kleureninhoud, transparenatiegroepen, niet-normaal blending, overprint en grafische overdrachtsfuncties of rendering-intents
Formulieren met eigen resources moeten hun kleurruimte vastleggen vóór kale sc/scn-operanden; gedeelde formulieren of afbeeldingen waarvan de overgeërfde broncontext verschilt, worden als niet-ondersteund gemeld, en gecachte fouten planten zich voort naar elke aanroepende scope
FailOnUnsupported staat standaard op true en laat het doel bij mislukking onaangetast; zet het op false om onafhankelijke, ondersteunde updates toe te staan, waarbij Complete op false gaat en er nooit een nieuw OutputIntent voor een partiële conversie wordt geschreven
Een partiëel resultaat kan een bestaand OutputIntent uit zijn bron behouden; OutputIntentWritten rapporteert specifiek of deze operatie een nieuwe doeldeclaratie heeft geplaatst
Een volledig resultaat sluit het opgegeven doel-ICC-profiel in en schrijft een OutputIntent met de gevraagde identifier; dit certificeert geen PDF/X, PDF/A of ander conformiteitsniveau
Bron en doel moeten verschillende streams zijn; de bronpositie wordt hersteld, voorbereidingsfouten laten het doel ongewijzigd en annulering behoudt EPdfOperationCancelled
Het publiceren van het klaargezette resultaat vervangt het doel via de stream-API; een exception bij het afkappen of schrijven van het doel kan partiële uitvoer achterlaten, dus aanroepers die atomische bestandpublicatie nodig hebben schrijven naar een tijdelijk bestand en hernoemen dat na succes
Versleuteling en bestaande handtekeningen vereisen een apart voorbereide, onversleutelde en niet-ondertekende bron; incrementele kleurconversie behoudt de geldigheid van handtekeningen niet
Standaardlimieten zijn 64 MiB per gedecodeerde content-/beeldstream, 512 MiB voor output-staging, 10,000 meldingen en diepte 64, naast de budgetten van de actieve-objectlezer
Het uitvoerbudget telt conservatief bronbytes, klaargezette vervangingsobjecten en gereserveerde xref-/trailer-overhead mee vóór elke update wordt opgeteld; de volledige trailerlengte is vóór serialisatie inbegrepen, en een begrensde uitvoerstream wijst schrijfbewerkingen boven de limiet af voordat zijn logische grootte groeit
Dit begrenst de logische output-staging, niet al het procesgeheugen of de afronding van de geheugenallocator, en de uiteindelijke geserialiseerde grootte wordt vóór publicatie opnieuw gecontroleerd
Echte conversie van RGB-, CMYK- en ICCBased-afbeeldingen, tekst-/vectorconversie, geneste formulieren, behoud van Separation en DeviceN, OutputIntent, gecomprimeerde objectstreams en PDF save/reopen/render zijn geverifieerd met Delphi en FPC op Win32 en 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;