Метод 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 без изменения компоновки встроенного потока
Опции
| Поле | По умолчанию | Значение |
|---|---|---|
MinimumSavingsBytes | 1 | Минимальное сокращение закодированного потока, необходимое для принятия кандидата |
EnforceSignaturePermissions | True | Отклонять любое переписывание, когда в документе есть поле подписи |
IncludeFormXObjects | True | Отслеживать вызываемые вложенные Form XObject |
IncludeAnnotationAppearances | True | Отслеживать потоки внешнего вида и состояния аннотаций |
Результат и безопасность
Возвращаемое значение — число переписанных встроенных программ шрифтов, а 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;