PDFium Delphi Component Docs

Conversão de cores ICC do documento

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

Exemplo

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);

Declarações públicas

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;