ConvertPdfDocumentColours lit la révision active du PDF, convertit les opérandes de composantes et les échantillons d’image d’origine avec un IPdfColourTransform, puis ajoute une révision cohérente dans un flux de sortie distinct
La conversion prend en charge les opérateurs de remplissage et de contour du texte et des vecteurs en DeviceGray, DeviceRGB, DeviceCMYK et ICCBased, les ressources de page héritées, les alias nommés des espaces par défaut, les Form XObjects imbriqués et les images brutes ou utilisant des filtres généraux avec des composantes de 8 bits ou 16 bits
Les tableaux de contenu partagent un analyseur d’opérandes et une pile d’état graphique, avec un espace entre les flux ; q/Q, les espaces de couleur par défaut et les nombres de composantes restent associés à leur espace source original pendant toute la conversion
Les opérandes CMYK viennent du contenu PDF et des flux d’image, jamais des accesseurs RGB après rendu ; fournissez DeviceCMYKProfile pour les sources DeviceCMYK sans profil
Les profils ICCBased source sont résolus dans leur portée de ressources d’origine ; seul un /Range [0 1 ...] absent ou par défaut est accepté ; les tableaux /Decode des images sont appliqués avant conversion puis retirés de l’image convertie
Les échantillons de 16 bits conservent l’ordre big-endian du PDF ; la géométrie exacte des octets et l’expansion de la cible sont vérifiées avant allocation, sans inventer d’octets de pas de ligne ou de remplissage
PreserveAllSpotColours vaut true par défaut ; sinon, remplissez PreservedSpotColours avec les noms décodés des colorants PDF ; un espace Separation ou DeviceN n’est conservé que si tous ses colorants sont sélectionnés
Les opérateurs de tons directs, fonctions de teinte et ressources conservés restent intacts ; les tons directs non sélectionnés nécessitent un backend dédié et sont signalés comme non pris en charge
Les masques de pochoir des images et les données de masque référencées restent intacts ; les masques par clé de couleur, masques explicites et composantes matte des masques souples nécessitent des politiques distinctes
Les cas non pris en charge comprennent les images DCT/JPX sans décodeur des composantes originales, les images de 1/2/4 bits et leur remplissage de ligne, les plages ICC non standard, les espaces Indexed/Cal/Lab/Pattern, les images en ligne, les fonctions de dégradé, les programmes de glyphes Type3, les couleurs des dictionnaires d’annotation, les instructions d’apparence par défaut des formulaires, le contenu couleur XFA, les groupes de transparence, les mélanges non normaux, la surimpression, les fonctions de transfert et intentions de rendu graphiques
Les Form disposant de leurs propres ressources doivent établir leur espace de couleur avant des opérandes sc/scn seuls ; les Form ou images partagés dont le contexte source hérité diffère sont signalés comme non pris en charge, et un échec mis en cache se propage à toutes les portées appelantes
FailOnUnsupported vaut true par défaut et préserve la destination en cas d’échec ; false autorise les modifications indépendantes prises en charge, met Complete à false et n’écrit jamais de nouvel OutputIntent pour une conversion partielle
Un résultat partiel peut conserver l’OutputIntent existant de sa source ; OutputIntentWritten indique précisément si cette opération a installé une nouvelle déclaration cible
Un résultat complet incorpore le profil ICC cible fourni et écrit un OutputIntent avec l’identifiant demandé ; cela ne certifie aucune conformité PDF/X, PDF/A ou autre
La source et la destination doivent être des flux distincts ; la position source est restaurée, les échecs de préparation laissent la destination intacte et l’annulation conserve EPdfOperationCancelled
La publication du résultat préparé remplace la destination via son API de flux ; une exception pendant la troncature ou l’écriture peut laisser une sortie partielle ; pour publier un fichier atomiquement, écrivez dans un fichier temporaire puis renommez-le après réussite
Le chiffrement et les signatures existantes nécessitent une source non chiffrée et non signée préparée séparément ; la conversion incrémentale des couleurs ne préserve pas la validité des signatures
Les limites par défaut sont de 64 MiB par flux de contenu/image décodé, 512 MiB de préparation de sortie, 10,000 problèmes signalés et une profondeur de 64, en plus des budgets du lecteur d’objets actifs
Le budget de sortie comprend par prudence les octets source, les objets de remplacement préparés et une réserve xref/trailer avant chaque mise à jour ; la longueur complète du trailer est comptée avant sérialisation, et un flux borné refuse toute écriture dépassant la limite avant d’augmenter sa taille logique
Cette limite porte sur la préparation logique de sortie, pas sur toute la mémoire du processus ni les arrondis de capacité de l’allocateur ; la taille sérialisée finale est vérifiée à nouveau avant publication
La conversion réelle des images RGB, CMYK et ICCBased, du texte et des vecteurs, les Form imbriqués, la conservation Separation et DeviceN, l’OutputIntent, les flux d’objets compressés et l’enregistrement/réouverture/rendu PDF sont vérifiés avec Delphi et FPC sur Win32 et 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;