ConvertPdfDocumentColours legge la revisione PDF attiva, converte gli operandi dei componenti originali e i campioni immagine tramite un IPdfColourTransform e aggiunge una revisione coerente a uno stream di output separato
Supporta operatori di riempimento e tratto di testo e vettori in DeviceGray, DeviceRGB, DeviceCMYK e ICCBased, risorse di pagina ereditate, alias degli spazi colore predefiniti, Form XObject annidati e immagini raw o con filtri generali con componenti a 8 o 16 bit
Gli array di contenuto condividono un unico parser degli operandi e uno stack dello stato grafico, con uno spazio tra gli stream; q/Q, spazi colore predefiniti e numero dei componenti rimangono associati agli spazi sorgente originali durante tutta la conversione
Gli operandi CMYK provengono dal contenuto PDF e dagli stream immagine, mai dai getter RGB renderizzati; fornire DeviceCMYKProfile per sorgenti DeviceCMYK senza profilo
I profili ICCBased sorgenti vengono risolti nel loro ambito di risorse originale; è supportato solo /Range [0 1 ...] assente o predefinito, mentre gli array /Decode delle immagini sono applicati prima della conversione e rimossi dall'immagine convertita
Le immagini mantengono l'ordine PDF big-endian per i campioni a 16 bit; geometria esatta dei byte ed espansione della destinazione sono controllate prima di allocare i campioni, senza inventare stride o byte di padding
PreserveAllSpotColours è true per impostazione predefinita; altrimenti compilare PreservedSpotColours con i nomi decodificati dei coloranti PDF. Uno spazio Separation o DeviceN viene mantenuto solo se sono selezionati tutti i coloranti elencati
Gli operatori delle tinte piatte mantenute, le funzioni di tinta e le risorse restano intatti; le tinte non selezionate richiedono un backend di conversione dedicato e vengono segnalate come non supportate
Le maschere stencil delle immagini e i dati delle maschere referenziate restano intatti; le maschere color-key, esplicite e le componenti matte delle soft mask richiedono politiche separate
Non sono supportati: immagini DCT/JPX senza decoder dei componenti originali, immagini a 1/2/4 bit e padding delle righe, intervalli ICC non predefiniti, spazi Indexed/Cal/Lab/Pattern, immagini inline, funzioni di shading, programmi dei glifi Type3, colori nei dizionari di annotazione, istruzioni di aspetto predefinito dei form, colori XFA, gruppi di trasparenza, blending non normale, overprint, funzioni di trasferimento grafico e intenti di rendering
I form con risorse proprie devono definire lo spazio colore prima di operandi sc/scn privi di qualificazione; form o immagini condivisi con contesti sorgente ereditati diversi vengono segnalati come non supportati e gli errori memorizzati in cache si propagano a ogni ambito chiamante
FailOnUnsupported è true per impostazione predefinita e conserva la destinazione in caso di errore; impostarlo a false consente aggiornamenti supportati indipendenti, imposta Complete a false e non scrive mai un nuovo OutputIntent per una conversione parziale
Un risultato parziale può mantenere un OutputIntent già presente nella sorgente; OutputIntentWritten indica specificamente se questa operazione ha installato una nuova dichiarazione di destinazione
Un risultato completo incorpora il profilo ICC di destinazione fornito e scrive un OutputIntent con l'identificatore richiesto; questo non certifica la conformità PDF/X, PDF/A o di altro tipo
Sorgente e destinazione devono essere stream distinti; la posizione della sorgente viene ripristinata, gli errori di preparazione lasciano invariata la destinazione e l'annullamento mantiene EPdfOperationCancelled
La pubblicazione del risultato preparato sostituisce la destinazione tramite la sua API di stream; un'eccezione durante il troncamento o la scrittura può lasciare un output parziale. Per pubblicare un file in modo atomico, scrivere in un file temporaneo e rinominarlo dopo il successo
Crittografia e firme esistenti richiedono una sorgente preparata separatamente, non cifrata e non firmata; la conversione incrementale dei colori non mantiene valide le firme
I valori predefiniti consentono 64 MiB per stream di contenuto o immagine decodificato, 512 MiB per la preparazione dell'output, 10,000 segnalazioni e profondità 64, oltre ai limiti del lettore degli oggetti attivi
Prima di accumulare ogni aggiornamento, il limite di output include prudenzialmente i byte sorgente, gli oggetti sostitutivi preparati e lo spazio riservato a xref e trailer; l'intera lunghezza del trailer è inclusa prima della serializzazione e uno stream limitato rifiuta scritture oltre soglia prima di aumentare la propria dimensione logica
Questi controlli limitano la preparazione logica dell'output, non tutta la memoria del processo né gli arrotondamenti di capacità dell'allocatore; la dimensione serializzata finale viene ricontrollata prima della pubblicazione
Conversioni reali di immagini RGB, CMYK e ICCBased, testo e vettori, form annidati, mantenimento di Separation e DeviceN, OutputIntent, stream di oggetti compressi e salvataggio, riapertura e rendering PDF sono verificati con Delphi e FPC su Win32 e 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;