PDFium Delphi Component Docs

Conversión de color ICC del documento

ConvertPdfDocumentColours lee la revisión PDF activa, convierte los operandos de componentes y las muestras de imagen originales mediante un IPdfColourTransform y agrega una revisión coherente a un flujo de salida independiente

Admite operadores de relleno y trazo de texto y vectores en espacios DeviceGray, DeviceRGB, DeviceCMYK e ICCBased, recursos de página heredados, alias con nombre para espacios de color predeterminados, Form XObjects anidados e imágenes sin compresión o con filtros generales y componentes de 8-bit o 16-bit

Los arreglos de contenido comparten un analizador de operandos y una pila de estado gráfico, con un espacio entre flujos; q/Q, los espacios de color predeterminados y el número de componentes siguen vinculados a sus espacios de origen durante toda la conversión

Los operandos CMYK se obtienen del contenido PDF y de los flujos de imagen, nunca de getters RGB del renderizado; indique DeviceCMYKProfile para fuentes DeviceCMYK sin perfil

Los perfiles ICCBased de origen se resuelven en su ámbito de recursos original; solo se admite /Range [0 1 ...] ausente o predeterminado, mientras que los arreglos /Decode de imagen se aplican antes de convertir y se eliminan de la imagen convertida

Las imágenes conservan el orden big-endian de PDF para muestras de 16-bit; antes de asignar memoria para las muestras se comprueban la geometría exacta en bytes y la expansión al destino, sin inventar stride ni bytes de relleno

PreserveAllSpotColours es true de forma predeterminada; de lo contrario, complete PreservedSpotColours con los nombres de colorantes PDF decodificados; un espacio Separation o DeviceN solo se conserva si se seleccionan todos sus colorantes

Los operadores de tintas directas conservados, sus funciones de tinte y sus recursos permanecen intactos; las tintas no seleccionadas requieren un backend específico de conversión y se informan como no compatibles

Las máscaras de esténcil de imagen y los datos de máscara referenciados se mantienen intactos; las máscaras por clave de color, las máscaras explícitas y los componentes matte de máscaras suaves necesitan políticas independientes

Quedan fuera del alcance las imágenes DCT/JPX sin decodificador de componentes originales, las imágenes de 1/2/4-bit y su relleno por fila, los rangos ICC no predeterminados, los espacios Indexed/Cal/Lab/Pattern, las imágenes inline, las funciones de sombreado, los programas de glifos Type3, los colores en diccionarios de anotación, las instrucciones de apariencia predeterminada de formularios, el contenido de color XFA, los grupos de transparencia, las mezclas no normales, la sobreimpresión y las funciones de transferencia gráfica o propósitos de renderizado

Los formularios con recursos propios deben establecer su espacio de color antes de los operandos sc/scn sin especificación previa; los formularios o imágenes compartidos con contextos de origen heredados distintos se informan como no compatibles, y los errores almacenados en caché se propagan a todos los ámbitos que los invocan

FailOnUnsupported es true de forma predeterminada y conserva el destino si hay un error; al establecerlo en false se permiten actualizaciones compatibles independientes, Complete pasa a false y nunca se escribe un OutputIntent nuevo para una conversión parcial

Un resultado parcial puede conservar un OutputIntent existente del origen; OutputIntentWritten indica específicamente si esta operación instaló una declaración nueva de destino

Un resultado completo incrusta el perfil ICC de destino proporcionado y escribe un OutputIntent con el identificador solicitado; esto no certifica PDF/X, PDF/A ni otro nivel de conformidad

Origen y destino deben ser flujos distintos; se restaura la posición del origen, los errores de preparación dejan el destino intacto y la cancelación conserva EPdfOperationCancelled

Al publicar el resultado preparado se reemplaza el destino mediante su API de flujo; una excepción al truncar o escribir puede dejar una salida parcial, por lo que, si se necesita publicación atómica de archivos, hay que escribir en un archivo temporal y renombrarlo tras completar la operación

El cifrado y las firmas existentes requieren un origen sin cifrar y sin firmar preparado por separado; la conversión incremental de color no conserva la validez de las firmas

Los valores predeterminados permiten 64 MiB por flujo de contenido o imagen decodificado, 512 MiB para preparar la salida, 10,000 informes de problemas y profundidad 64, además de los límites del lector de objetos activos

Antes de acumular cada actualización, el presupuesto de salida incluye de forma conservadora los bytes de origen, los objetos de reemplazo preparados y una reserva para xref/trailer; antes de serializar se incluye la longitud completa del trailer, y un flujo de salida acotado rechaza las escrituras que exceden el límite antes de aumentar su tamaño lógico

Esto limita la preparación lógica de la salida, no toda la memoria del proceso ni el redondeo de capacidad del asignador; el tamaño serializado final se comprueba nuevamente antes de publicar

Con Delphi y FPC en Win32 y Win64 se verifican conversiones reales de imágenes RGB, CMYK e ICCBased, texto y vectores, formularios anidados, conservación de Separation y DeviceN, OutputIntent, flujos de objetos comprimidos y guardado, reapertura y renderizado de PDF

Ejemplo

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

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