ConvertPdfDocumentColours lê a revisão ativa do PDF, converte operandos de componentes originais e amostras de imagem através de um IPdfColourTransform e acrescenta 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 predefinidos nomeados, Form XObjects aninhados e imagens brutas ou com filtro geral com componentes de 8 ou 16 bits
Arrays de conteúdo partilham um parser de operandos e uma pilha de estado gráfico com um espaço entre os streams; q/Q, predefinições de espaço de cor e contagens de componentes permanecem vinculados aos seus espaços de origem originais durante toda a conversão
Os operandos CMYK vêm do conteúdo PDF e dos streams de imagem, nunca de getters RGB renderizados; disponibilize DeviceCMYKProfile para origens DeviceCMYK sem perfil
Os perfis ICCBased de origem são resolvidos a partir do seu âmbito original de recursos; apenas um /Range [0 1 ...] em falta ou predefinido é suportado, enquanto arrays /Decode de imagem são aplicados antes da conversão e removidos da imagem convertida
As 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 assume por predefinição o valor true; caso contrário, preencha PreservedSpotColours com os nomes de colorantes PDF descodificados, 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 comunicados 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 descodificador de componentes originais, imagens de 1/2/4 bits e o seu padding de linha, intervalos ICC não predefinidos, 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 têm de estabelecer o seu espaço de cor antes de operandos sc/scn sem namespace; formulários ou imagens partilhados cujo contexto de origem herdado difere são comunicados como não suportados, e falhas em cache propagam-se a todo o âmbito que as invocar
FailOnUnsupported assume por predefinição o valor true e preserva o destino em caso de falha; defini-lo como false permite atualizações suportadas independentes, define Complete como false e nunca escreve um novo OutputIntent para uma conversão parcial
Um resultado parcial pode manter um OutputIntent existente da sua origem; OutputIntentWritten comunica especificamente se esta operação instalou uma nova declaração de alvo
Um resultado completo incorpora o perfil ICC de alvo fornecido e escreve um OutputIntent com o identificador pedido; isto não certifica PDF/X, PDF/A ou outro nível de conformidade
Origem e destino têm de 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 através da API de stream deste; uma exceção ao truncar ou escrever o destino pode deixar saída parcial, por isso quem precisar de publicação atómica em ficheiro deve escrever para um ficheiro temporário e renomeá-lo após o sucesso
Encriptação e assinaturas existentes exigem uma origem separada, não encriptada e não assinada; a conversão incremental de cores não preserva a validade das assinaturas
As predefinições permitem 64 MiB por stream de conteúdo/imagem descodificado, 512 MiB para staging de saída, 10,000 relatórios de problemas e profundidade 64, para além dos orçamentos do leitor de objetos ativos
O orçamento de saída inclui de forma conservadora 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 recusa escritas para além do limite antes de crescer o seu tamanho lógico
Isto 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 guardar/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;