PDFium Delphi Component Docs

ICC-преобразование цвета документа

ConvertPdfDocumentColours читает активную редакцию PDF, преобразует исходные операнды компонентов и выборки изображений через IPdfColourTransform и дописывает согласованную редакцию в отдельный выходной поток

Поддерживаются текстовые и векторные операторы заливки/обводки в пространствах DeviceGray, DeviceRGB, DeviceCMYK и ICCBased, наследуемые ресурсы страниц, именованные псевдонимы цветовых пространств по умолчанию, вложенные Form XObject и изображения с сырыми или общими фильтрами и 8- или 16-битными компонентами

Массивы содержимого делят один парсер операндов и стек графического состояния с пробелом между потоками; q/Q, цветовые пространства по умолчанию и счётчики компонентов остаются привязанными к исходным пространствам на всём протяжении преобразования

Операнды CMYK берутся из содержимого PDF и потоков изображений, но никогда из рендерящих RGB-геттеров; для непрофилированных источников DeviceCMYK передайте DeviceCMYKProfile

Исходные профили ICCBased разрешаются в своей исходной области ресурсов; поддерживается только отсутствующий или заданный по умолчанию /Range [0 1 ...], при этом массивы /Decode изображений применяются до преобразования и удаляются из преобразованного изображения

Изображения сохраняют порядок big-endian PDF для 16-битных выборок; точная байтовая геометрия и расширение под цель проверяются до выделения памяти под выборки, а байты шага строки или заполнения не выдумываются

PreserveAllSpotColours по умолчанию true; иначе заполните PreservedSpotColours декодированными именами красок PDF, а пространство Separation или DeviceN сохраняется, только когда выбрана каждая перечисленная краска

Сохранённые spot-операторы, tint-функции и ресурсы остаются нетронутыми; невыбранные spot-цвета требуют отдельного бэкенда преобразования и сообщаются как неподдерживаемые

Шаблонные маски изображений и ссылаемые данные масок остаются нетронутыми; маски по цветовым ключам, явные маски и компоненты матрицы soft-mask требуют отдельных политик

Неподдерживаемые границы: изображения DCT/JPX без декодера исходных компонентов, изображения с 1/2/4 битами и заполнение их строк, нестандартные диапазоны ICC, пространства Indexed/Cal/Lab/Pattern, встроенные изображения, shading-функции, программы глифов Type3, цвета в словарях аннотаций, инструкции default appearance форм, цветовое содержимое XFA, группы прозрачности, ненормальное смешивание, overprint, функции переноса графики и rendering intent

Формы с собственными ресурсами должны установить цветовое пространство до «голых» операндов sc/scn; общие формы или изображения, чей унаследованный контекст источника различается, сообщаются как неподдерживаемые, а кешированные сбои распространяются на каждую вызывающую область

FailOnUnsupported по умолчанию true и сохраняет целевой документ при сбое; значение false разрешает независимые поддерживаемые обновления, выставляет Complete в false и никогда не пишет новый OutputIntent для частичного преобразования

Частичный результат может сохранить существующий OutputIntent своего источника; OutputIntentWritten сообщает именно о том, установила ли эта операция новое целевое объявление

Полный результат встраивает переданный целевой ICC-профиль и записывает OutputIntent с запрошенным идентификатором; это не сертифицирует PDF/X, PDF/A или другой уровень соответствия

Источник и назначение должны быть разными потоками; позиция источника восстанавливается, сбои подготовки оставляют назначение неизменным, а отмена сохраняет EPdfOperationCancelled

Публикация подготовленного результата заменяет назначение через его потоковый API; исключение при усечении или записи назначения может оставить частичный вывод, поэтому для атомарной публикации в файл пишите во временный файл и переименовывайте его после успеха

Шифрование и существующие подписи требуют отдельно подготовленного незашифрованного неподписанного источника; инкрементальное преобразование цвета не сохраняет действительность подписей

Значения по умолчанию: 64 МиБ на декодированный поток содержимого/изображения, 512 МиБ на подготовку вывода, 10 000 отчётов о проблемах и глубина 64 — сверх бюджетов читателя активных объектов

Бюджет вывода консервативно включает байты источника, подготовленные замещающие объекты и резерв на xref/trailer до накопления каждого обновления; полная длина trailer-а включается до сериализации, а ограниченный выходной поток отклоняет запись сверх лимита до роста логического размера

Это ограничивает логическую подготовку вывода, а не всю память процесса или округление аллокатора, и итоговый сериализованный размер проверяется ещё раз перед публикацией

Реальное преобразование изображений RGB, CMYK и ICCBased, текста и векторов, вложенных форм, сохранение Separation и DeviceN, OutputIntent, сжатые объектные потоки и сохранение/переоткрытие/рендеринг PDF проверены с Delphi и FPC на Win32 и 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;