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;