DeduplicateResources

Манипуляция документами, Оптимизация

Описание

Находит побайтово идентичные косвенные потоки ресурсов по всему загруженному документу, перенаправляет каждую ссылку на детерминированный канонический поток и при необходимости удаляет дублирующиеся косвенные объекты

Равенство требует как не зависящей от порядка подписи полного словаря потока, так и точного совпадения закодированной полезной нагрузки потока, поэтому маски изображений, цветовые пространства, массивы decode, привязки optional content, идентификаторы структуры, метаданные, фильтры и каждая смысловая запись словаря остаются частью решения

Синтаксис

Delphi

Function TPDFlib.DeduplicateResources(
  Options: Integer= PDF_RESOURCE_DEDUP_DEFAULT): Integer; Overload;
Function TPDFlib.DeduplicateResources(Options: Integer;
  Out Stats: TPDFlibResourceDedupStats): Integer; Overload;

Параметры

OptionsПобитовая комбинация констант опций дедупликации ресурсов
StatsПринимает счетчики сканирования, хеширования, сравнения, ссылок, полезной нагрузки, категорий и объектов-сирот

Опции типа ресурса

PDF_RESOURCE_DEDUP_IMAGESВключает image XObjects, явные маски изображений, soft-mask изображения, альтернативные изображения и миниатюры
PDF_RESOURCE_DEDUP_FORMSВключает Form XObjects, такие как повторно используемая графика страниц, appearances аннотаций и группы прозрачности
PDF_RESOURCE_DEDUP_PATTERNSВключает потоковые tiling patterns
PDF_RESOURCE_DEDUP_SHADINGSВключает потоковые mesh shadings
PDF_RESOURCE_DEDUP_FUNCTIONSВключает потоки выборочных функций
PDF_RESOURCE_DEDUP_ICC_PROFILESВключает потоки профилей ICC, на которые ссылаются цветовые пространства ICCBased или output intents
PDF_RESOURCE_DEDUP_FONT_PROGRAMSВключает потоки, на которые ссылаются FontFile, FontFile2 или FontFile3
PDF_RESOURCE_DEDUP_CMAPSВключает потоки CMap и ToUnicode
PDF_RESOURCE_DEDUP_TYPE3_CHARPROCSВключает потоки процедур глифов Type 3
PDF_RESOURCE_DEDUP_EMBEDDED_FILESВключает потоки внедренных файлов
PDF_RESOURCE_DEDUP_METADATAВключает потоки метаданных
PDF_RESOURCE_DEDUP_POSTSCRIPTIncludes PostScript XObjects
PDF_RESOURCE_DEDUP_ALL_TYPESОбъединяет все двенадцать флагов типов ресурсов

Опции операции

PDF_RESOURCE_DEDUP_DRY_RUNСообщает о дублирующихся потоках и ссылках, не меняя граф объектов и не собирая объекты
PDF_RESOURCE_DEDUP_GARBAGE_COLLECTЗапускает сборку mark-and-sweep после перенаправления ссылок
PDF_RESOURCE_DEDUP_DEFAULTОбъединяет все типы ресурсов со сборкой мусора

Возвращаемые значения

Положительное значениеЧисло дублирующихся косвенных потоков, консолидированных или сообщенных пробным запуском
0Подходящий дублирующийся поток не найден либо документ не загружен

Примечания

Наименьший номер объекта и поколение в каждой группе точной эквивалентности становятся каноническим потоком, что делает повторные запуски детерминированными

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

Ресурсы с равным декодированным содержимым, но разными фильтрами или закодированными байтами, остаются раздельными, как и ресурсы, чьи словари ссылаются на разные вложенные объекты

Все кандидаты полезной нагрузки один раз хешируются SHA-256, а побайтовое подтверждение выполняется только внутри bucket-а с совпадающими хешем и подписью словаря

Метод работает с косвенными потоками, поскольку ISO 32000 требует, чтобы потоки были косвенными объектами, а общие ресурсы представляются косвенными ссылками

Используйте значение по умолчанию после правки документа и перед полной записью, чтобы немедленно вернуть байты дублирующихся объектов

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

Пример

var
  Stats: TPDFlibResourceDedupStats;
  Merged: Integer;
begin
  Merged:= PDF.DeduplicateResources(
    PDF_RESOURCE_DEDUP_DEFAULT, Stats);
  PDF.SaveToFile('optimised.pdf');
end;

См. также

TPDFlibResourceDedupStats, PurgeUnusedResources, GarbageCollectObjects