Метод THotPDF.SubsetLoadedFonts

Переписывает встроенные программы поддерживаемых шрифтов TrueType, OpenType CFF, raw CFF и Type 1 так, чтобы в них остались только глифы, достижимые из содержимого загруженного документа

Объявление

function SubsetLoadedFonts(
    const Options: THPDFLoadedFontSubsetOptions;
    out AInfo: THPDFLoadedFontSubsetInfo): Integer; overload;
function SubsetLoadedFonts(
    out AInfo: THPDFLoadedFontSubsetInfo): Integer; overload;

Достижимость

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

IncludeFormXObjects рекурсивно включает вызываемые Form XObject с унаследованными ресурсами, с обнаружением циклов и ограниченной глубиной вложенности

IncludeAnnotationAppearances включает внешние виды normal, rollover и down вместе со словарями состояний, а при включённой опции также переходит к Form XObject, которые используют эти внешние виды

Каждый код символа проходит по объявленной кодировке, затем по Type0 CMap и CIDToGIDMap, прежде чем добраться до стабильного встроенного glyph ID; существующие CID-отображения и данные ToUnicode не перенумеровываются

Составные глифы TrueType сохраняют рекурсивное замыкание своих компонентов, а слои COLR v0 и paint-зависимости глифов COLR v1 сохраняют все ссылаемые контуры

Простые шрифты Type 1 следуют кодировкам Standard, WinAnsi, MacRoman или MacExpert плюс Differences, после чего неиспользуемые CharStrings переписываются в данных PFB, PDF split binary или hex PFA без изменения компоновки встроенного потока

Опции

ПолеПо умолчаниюЗначение
MinimumSavingsBytes1Минимальное сокращение закодированного потока, необходимое для принятия кандидата
EnforceSignaturePermissionsTrueОтклонять любое переписывание, когда в документе есть поле подписи
IncludeFormXObjectsTrueОтслеживать вызываемые вложенные Form XObject
IncludeAnnotationAppearancesTrueОтслеживать потоки внешнего вида и состояния аннотаций

Результат и безопасность

Возвращаемое значение — число переписанных встроенных программ шрифтов, а AInfo сообщает охват сканирования, сбои отображения или декодирования, использованные глифы, экономию байтов и последствия для подписей

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

Переписывание Type 1 безопасно отказывает в работе при нескольких бинарных сегментах PFB, нечитаемой явной кодировке простого шрифта, отсутствии запрошенного имени глифа или неподдерживаемой компоновке CharString; неизвестные версии COLR и sfnt-программы без sparse-таблиц контуров тоже остаются неизменными

Все кандидаты анализируются до внесения изменений, а политика подписей по умолчанию возвращает ноль с установленным RefusedBySignaturePolicy; отключение политики разрешает переписывание и устанавливает SignaturesInvalidated при любом изменении подписанного документа

Пример

var
  Info: THPDFLoadedFontSubsetInfo;
begin
  PDF.LoadFromFile('input.pdf');
  if PDF.SubsetLoadedFonts(Info) > 0 then
    PDF.SaveToFile('subset.pdf');
end;

Оптимизация ресурсов и изображений