ConvertPdfDocumentColours lê a revisão ativa do PDF, converte operandos de componentes originais e amostras de imagem por meio de um IPdfColourTransform e anexa uma revisão coerente a um stream de saída separado
Suporta operadores de fill/stroke de texto e vetor nos espaços DeviceGray, DeviceRGB, DeviceCMYK e ICCBased, recursos de página herdados, aliases de espaços de cor padrão nomeados, Form XObjects aninhados e imagens brutas ou com filtro geral com componentes de 8 ou 16 bits
Arrays de conteúdo compartilham um parser de operandos e uma pilha de estado gráfico com um espaço entre os streams; q/Q, padrões de espaço de cor e contagens de componentes permanecem vinculados aos seus espaços de origem originais durante toda a conversão
Operandos CMYK vêm do conteúdo PDF e dos streams de imagem, nunca de getters RGB renderizados; forneça DeviceCMYKProfile para origens DeviceCMYK sem perfil
Perfis ICCBased de origem são resolvidos a partir do escopo original de recursos; apenas um /Range [0 1 ...] ausente ou padrão tem suporte, enquanto arrays /Decode de imagem são aplicados antes da conversão e removidos da imagem convertida
Imagens mantêm a ordem big-endian do PDF para amostras de 16 bits; a geometria exata de bytes e a expansão do alvo são verificadas antes da alocação das amostras, e nenhum byte de stride ou padding é inventado
PreserveAllSpotColours tem padrão true; caso contrário, preencha PreservedSpotColours com os nomes de colorantes PDF decodificados, e um espaço Separation ou DeviceN é preservado apenas quando todos os colorantes listados forem selecionados
Operadores spot preservados, funções de tint e recursos permanecem intactos; spots não selecionados exigem um backend de conversão dedicado e são relatados como não suportados
Máscaras de stencil de imagem e dados de máscara referenciados permanecem intactos; máscaras color-key, máscaras explícitas e componentes matte de soft mask exigem políticas separadas
Os limites não suportados incluem imagens DCT/JPX sem um decodificador de componentes originais, imagens de 1/2/4 bits e seu padding de linha, intervalos ICC não padrão, espaços Indexed/Cal/Lab/Pattern, imagens inline, funções de shading, programas de glifos Type3, cores de dicionário de anotação, instruções de default appearance de formulário, conteúdo de cor XFA, grupos de transparência, blending não normal, overprint e funções de transferência gráfica ou rendering intents
Formulários com recursos próprios devem estabelecer seu espaço de cor antes de operandos sc/scn sem namespace; formulários ou imagens compartilhados cujo contexto de origem herdado difere são relatados como não suportados, e falhas em cache se propagam para todo escopo que as invocar
FailOnUnsupported tem padrão true e preserva o destino em caso de falha; defini-lo como false permite atualizações suportadas independentes, define Complete como false e nunca grava um novo OutputIntent para uma conversão parcial
Um resultado parcial pode manter um OutputIntent existente de sua origem; OutputIntentWritten relata especificamente se esta operação instalou uma nova declaração de alvo
Um resultado completo incorpora o perfil ICC de alvo fornecido e grava um OutputIntent com o identificador solicitado; isso não certifica PDF/X, PDF/A ou outro nível de conformidade
Origem e destino devem ser streams distintos; a posição da origem é restaurada, falhas de preparação deixam o destino inalterado, e o cancelamento preserva EPdfOperationCancelled
Publicar o resultado preparado substitui o destino por meio da API de stream dele; uma exceção ao truncar ou gravar o destino pode deixar saída parcial, então quem precisar de publicação atômica em arquivo deve gravar em um arquivo temporário e renomeá-lo após o sucesso
Criptografia e assinaturas existentes exigem uma origem separada, não criptografada e não assinada; a conversão incremental de cores não preserva a validade de assinaturas
Os padrões permitem 64 MiB por stream de conteúdo/imagem decodificado, 512 MiB para staging de saída, 10,000 relatórios de problemas e profundidade 64, além dos orçamentos do leitor de objetos ativos
O orçamento de saída inclui conservadoramente os bytes de origem, os objetos de substituição preparados e a sobrecarga reservada de xref/trailer antes de acumular cada atualização; o comprimento completo do trailer é incluído antes da serialização, e um stream de saída com limite rejeita gravações além do limite antes de crescer seu tamanho lógico
Isso limita o staging lógico de saída, e não toda a memória do processo nem o arredondamento de capacidade do alocador de memória; o tamanho final serializado é verificado novamente antes da publicação
Conversão real de imagens RGB, CMYK e ICCBased, conversão de texto/vetor, formulários aninhados, preservação de Separation e DeviceN, OutputIntent, object streams comprimidos e salvar/reabrir/renderizar PDF são verificados com Delphi e FPC no Win32 e no 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;