UGLYPEAR AI обновил бизнес: высокопроизводительное сжатие документов × RAG-платформа инженерии данныхУзнать о новом направлении →

Принцип сабсеттинга шрифтов PDF: почему объём уменьшается на 90%

Главный вывод: сабсеттинг шрифтов PDF уменьшает объём на 90% потому, что китайский шрифт весит 15–20 МБ, а в документе фактически используется лишь 1–2 тысячи символов. Суть сабсеттинга — три шага: сканирование фактически использованных символов в документе, перестроение таблицы CMap, переиндексация глифов с отбрасыванием неиспользуемых. Полный файл Source Han Serif — 18 МБ, после сабсеттинга — всего 0,4 МБ, снижение 97,7%. Ниже — структура файла шрифта, технические детали сабсеттинга и замеры по трём шрифтам.

Если вы пока не знакомы с общими методами сжатия PDF, рекомендуем сначала прочитать Принципы и методы сжатия PDF.

1. Структура файла шрифта: почему внедрённый китайский шрифт такой большой

Чтобы понять, почему сабсеттинг так эффективен, нужно разобраться, что внутри файла шрифта. TrueType (.ttf) и OpenType (.otf) состоят из множества таблиц, каждая отвечает за свою функцию. При внедрении в PDF эти таблицы упаковываются целиком, независимо от того, сколько символов используется в документе.

Таблица данныхФункцияТипичная доляМожно ли сократить при сабсеттинге
cmapСопоставление кодировки символа индексу глифа1%–3%Требует перестроения
glyfДанные контуров глифов TrueType70%–85%Можно сильно сократить
CFFКонтуры глифов OpenType CFF (PostScript)60%–80%Можно сильно сократить
locaИндекс позиций данных глифов1%–2%Требует перестроения
hmtxГоризонтальные метрики (ширина символа/продвижение)2%–5%Требует перестроения
nameИмя шрифта, копирайт и метаинформация0,5%–1%Сохраняется
postСопоставление имён PostScript1%–3%Частично сокращается

Из таблицы видно: данные контуров глифов (glyf или CFF) — это 60–85% объёма файла шрифта. Китайский шрифт содержит от 20 000 до 70 000 глифов, средний контур одного иероглифа — 300–600 байт, итого 10–20 МБ. А в 50-страничном PDF обычно используется лишь 800–2000 уникальных символов — значит, более 95% данных глифов не нужны. Это и есть поле для сабсеттинга.

2. Принцип сабсеттинга: три шага для отбрасывания неиспользуемых глифов

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

ШагДействиеПринципОбрабатываемые таблицы
1. Сканирование использованных символовОбход всех страничных потоков контента PDF, извлечение отображаемых кодировок символовЧерез разбор операторов текста (Tj/TJ) собираются Unicode-кодпойнтыНет (формируется набор символов)
2. Перестроение таблицы CMapВосстановление отображения кодировки в индекс глифа по фактически использованным символамСохраняются только записи для использованных символов, остальные удаляютсяcmap
3. Переиндексация глифовНепрерывное переупорядочение использованных глифов, обновление всех ссылок на индексыИсходные индексы могут быть не подряд, после переупорядочения индексы 0…N идут подрядglyf/CFF, loca, hmtx

2.1. Сканирование использованных символов

Первый шаг — просканировать PDF и найти все фактически отображённые символы. Текст в PDF записывается через операторы текста (Tj — отображение строки, TJ — отображение массива) в потоке контента, каждый символ имеет свою кодировку. Инструмент сабсеттинга обходит потоки контента всех страниц, извлекает эти кодировки, через текущую таблицу CMap шрифта переводит в Unicode-кодпойнты и получает «набор использованных символов».

При сканировании нужно обрабатывать особые случаи: ToUnicode CMap (обратное отображение), многобайтные кодировки (обычны для CJK-шрифтов), префикс сабсеттинга внедрённого шрифта (формат 6 символов + плюс). В 50-страничном китайском PDF обычно сканируется 800–2000 уникальных Unicode-символов, плюс знаки препинания и цифры — итого 1000–2500 глифов к сохранению.

2.2. Перестроение таблицы CMap

Таблица CMap — это «каталог» шрифта, в котором записано, какой индекс глифа соответствует какой кодировке символа. В исходном китайском шрифте таблица CMap содержит от 20 000 до 70 000 записей, после сабсеттинга остаются лишь записи для использованных символов. При перестроении также нужно обрабатывать разные форматы подтаблиц кодировки.

Формат подтаблицы CMapДиапазон кодировкиНазначениеОбработка при сабсеттинге
Format 00–255Однобайтный ASCII/LatinСокращение неиспользуемых записей
Format 4Базовая плоскость BMPЧастые символы CJKПерестроение таблицы сегментов
Format 12Весь UnicodeПокрытие всех символовСокращение неиспользуемых сегментов

2.3. Переиндексация глифов

Это самый критичный и сложный шаг. В исходном шрифте индексы глифов (GID) идут подряд от 0 до N, но нужные глифы могут быть разбросаны. Переиндексация — это расположить сохраняемые глифы подряд в новом порядке: исходный GID 0 (.notdef) остаётся, исходный GID 1523 может стать новым GID 1, исходный GID 8944 — новым GID 2, и так далее.

После переиндексации нужно синхронно обновить все таблицы со ссылками на GID: таблица glyf (или CFF) хранит данные только нужных глифов в новом порядке, таблица loca перестраивает индекс позиций, таблица hmtx — горизонтальные метрики, таблица post обновляет соответствие имён PostScript. Неправильная обработка на этом шаге ломает шрифт, поэтому требуется строгое следование спецификации OpenType.

3. Замеры: сравнение сабсеттинга для трёх шрифтов

Мы взяли три популярных шрифта для теста сабсеттинга — китайские (Source Han Serif, Microsoft YaHei) и латинский (Arial). Тестовый документ — 50-страничный китайский тендер, использовано 1342 символа.

ШрифтИсходный файлЧисло глифов (исх.)Число глифов (сабсет)После сабсеттингаСнижение
Source Han Serif Regular18,2 МБ65 53513420,42 МБ97,7%
Microsoft YaHei Regular15,6 МБ28 62213420,35 МБ97,8%
Arial Regular0,82 МБ3257960,06 МБ92,7%

Замеры показывают: сабсеттинг китайских шрифтов наиболее эффективен — Source Han Serif с 18,2 МБ до 0,42 МБ, снижение 97,7%. Причина: в китайском шрифте много глифов (60 000+), но в документе используется мало (1000+), и поле для сокращения огромно. Латинский Arial весит всего 0,82 МБ, после сабсеттинга 0,06 МБ, снижение 92,7% — абсолютный объём невелик, но процент сопоставим.

Эффект сабсеттинга при разном объёме использования символов (на примере Source Han Serif):

Тип документаЧисло использованных символовОбъём после сабсеттингаСнижениеОписание
Короткое уведомление (1 стр.)~2000,08 МБ99,6%Символов очень мало, сабсет крошечный
Протокол совещания (10 стр.)~6000,19 МБ99,0%Обычный офисный документ
Тендерная документация (50 стр.)~13420,42 МБ97,7%Широкое покрытие символов в профессиональном документе
Техническое руководство (200 стр.)~28000,85 МБ95,3%Большое число символов
Энциклопедия (1000 стр.)~65001,92 МБ89,5%Близко к предельному покрытию

4. Сравнение инструментов сабсеттинга и рекомендации по сценариям

Для сабсеттинга шрифтов есть несколько инструментов — от open-source командной строки до коммерческих движков сжатия, у каждого свои плюсы и минусы. Сравним основные решения.

ИнструментКачество сабсеттингаПоддержка CFFПакетная обработкаСложность интеграции
SmartSlim★★★★★ДаПоддерживаетсяSDK/API/Desktop
fonttools (Python)★★★★☆ДаНужен скриптСредняя
Adobe Acrobat★★★★☆ДаОграниченноGUI-операции
Ghostscript★★★☆☆ЧастичноПоддерживаетсяКомандная строка
Онлайн-инструменты★★☆☆☆ЧастичноНе поддерживаетсяНизкая (риск приватности)

SmartSlim на собственном движке сжатия на Rust при сабсеттинге автоматически обрабатывает оба формата глифов — TrueType и OpenType CFF, поддерживает пакетную обработку сотен PDF перетаскиванием. Важнее всего — весь процесс сабсеттинга идёт локально, данные шрифтов и документа не проходят через внешние серверы, что критично для режимных и корпоративных конфиденциальных документов.

Рекомендации по стратегии сабсеттинга в разных сценариях:

СценарийРекомендуется ли сабсеттингНа что обратить вниманиеРекомендуемый инструмент
Архивирование и рассылка финальной версииНастоятельно рекомендуетсяПосле сабсеттинга нельзя добавлять новые символыSmartSlim
Корпоративное пакетное архивированиеНастоятельно рекомендуетсяАвтоматизация через APISmartSlim Server
Онлайн-публикация / превьюРекомендуетсяУменьшение объёма загрузки, ускорение загрузкиСкрипт fonttools
Черновик, требующий редактированияНе рекомендуетсяСохранить полный шрифт для редактированияПока без сабсеттинга
Режимные/секретные документыРекомендуетсяОбязательно локальная обработка, онлайн-инструменты запрещеныSmartSlim

Больше приёмов оптимизации PDF см. в Руководстве по линеаризации PDF и Методах сжатия документов Word.

5. Часто задаваемые вопросы (FAQ)

В1. Влияет ли сабсеттинг шрифтов PDF на отображение?

Нет. Сабсеттинг выбрасывает только неиспользуемые в документе символы и данные глифов; сохранённые символы полностью идентичны исходному шрифту, на отображение это не влияет. Сабсеттинг-шрифт по-прежнему векторный, не теряет качества при масштабировании, цвет и толщина также сохраняются. Единственное ограничение: сабсеттинг-шрифт можно использовать только в этом документе, в других его применить нельзя.

В2. Насколько сабсеттинг уменьшает объём?

Зависит от отношения использованных символов к размеру исходного шрифта. Китайский шрифт (например, Source Han Serif 18 МБ) обычно использует 1000–2000 символов, после сабсеттинга — 0,3–0,8 МБ, снижение более 95%. Латинский (например, Arial 0,8 МБ) использует ещё меньше символов, после сабсеттинга — 0,05–0,1 МБ, снижение около 90%. Чем больше шрифт и чем меньше использовано символов, тем значительнее эффект.

В3. Можно ли редактировать текст в PDF после сабсеттинга?

С ограничениями. Сабсеттинг сохраняет только символы, использованные в документе. Если при редактировании будет введён новый символ (не встречавшийся в исходном документе), он не сможет отобразиться — появится пустая рамка или пробел. Поэтому сабсеттинг подходит для финальной версии и рассылки, но не для документов, которые ещё будут активно редактироваться. Если нужно редактировать — оставьте полный шрифт или переподключите сабсет.

В4. Как проверить, что PDF уже прошёл сабсеттинг шрифтов?

Откройте PDF в Adobe Acrobat, нажмите Файл → Свойства → Шрифты и посмотрите список внедрённых шрифтов. Если у названия шрифта есть префикс из шести символов (например, ABCDEO+Source Han Serif), значит, сабсеттинг уже выполнен. Также можно открыть PDF в SmartSlim: движок автоматически проанализирует состояние внедрения шрифтов и сообщит, нужен ли сабсеттинг, а также оценит возможное уменьшение объёма.

Заключение

Сабсеттинг шрифтов PDF — одно из самых эффективных средств уменьшения объёма PDF, особенно заметен эффект на документах со внедрёнными китайскими шрифтами. Суть — три шага: сканирование использованных символов, перестроение CMap, переиндексация глифов с отбрасыванием неиспользуемых. Замеры показывают: Source Han Serif 18 МБ после сабсеттинга всего 0,4 МБ, снижение 97,7%, на отображение — ноль влияния.

Практические советы: перед рассылкой финальной версии обязательно делать сабсеттинг шрифтов, режимные документы обрабатывать локальными инструментами. Если нужно пакетно обрабатывать PDF, SmartSlim поддерживает 10+ категорий и 40+ форматов (PDF, изображения, видео, Office, OFD и др.), автоматически выполняет сабсеттинг шрифтов на собственном движке Rust, данные не покидают контур.

Похожие материалы

Нужно сжать файлы? Попробуйте SmartSlim

Собственный движок сжатия на Rust, поддержка 10+ категорий и 40+ форматов (PDF, изображения, видео, Office, OFD и др.), локальная обработка — данные не покидают контур.