Главный вывод: сабсеттинг шрифтов 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 | Данные контуров глифов TrueType | 70%–85% | Можно сильно сократить |
| CFF | Контуры глифов OpenType CFF (PostScript) | 60%–80% | Можно сильно сократить |
| loca | Индекс позиций данных глифов | 1%–2% | Требует перестроения |
| hmtx | Горизонтальные метрики (ширина символа/продвижение) | 2%–5% | Требует перестроения |
| name | Имя шрифта, копирайт и метаинформация | 0,5%–1% | Сохраняется |
| post | Сопоставление имён PostScript | 1%–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 0 | 0–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 Regular | 18,2 МБ | 65 535 | 1342 | 0,42 МБ | 97,7% |
| Microsoft YaHei Regular | 15,6 МБ | 28 622 | 1342 | 0,35 МБ | 97,8% |
| Arial Regular | 0,82 МБ | 3257 | 96 | 0,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 стр.) | ~200 | 0,08 МБ | 99,6% | Символов очень мало, сабсет крошечный |
| Протокол совещания (10 стр.) | ~600 | 0,19 МБ | 99,0% | Обычный офисный документ |
| Тендерная документация (50 стр.) | ~1342 | 0,42 МБ | 97,7% | Широкое покрытие символов в профессиональном документе |
| Техническое руководство (200 стр.) | ~2800 | 0,85 МБ | 95,3% | Большое число символов |
| Энциклопедия (1000 стр.) | ~6500 | 1,92 МБ | 89,5% | Близко к предельному покрытию |
4. Сравнение инструментов сабсеттинга и рекомендации по сценариям
Для сабсеттинга шрифтов есть несколько инструментов — от open-source командной строки до коммерческих движков сжатия, у каждого свои плюсы и минусы. Сравним основные решения.
| Инструмент | Качество сабсеттинга | Поддержка CFF | Пакетная обработка | Сложность интеграции |
|---|---|---|---|---|
| SmartSlim | ★★★★★ | Да | Поддерживается | SDK/API/Desktop |
| fonttools (Python) | ★★★★☆ | Да | Нужен скрипт | Средняя |
| Adobe Acrobat | ★★★★☆ | Да | Ограниченно | GUI-операции |
| Ghostscript | ★★★☆☆ | Частично | Поддерживается | Командная строка |
| Онлайн-инструменты | ★★☆☆☆ | Частично | Не поддерживается | Низкая (риск приватности) |
SmartSlim на собственном движке сжатия на Rust при сабсеттинге автоматически обрабатывает оба формата глифов — TrueType и OpenType CFF, поддерживает пакетную обработку сотен PDF перетаскиванием. Важнее всего — весь процесс сабсеттинга идёт локально, данные шрифтов и документа не проходят через внешние серверы, что критично для режимных и корпоративных конфиденциальных документов.
Рекомендации по стратегии сабсеттинга в разных сценариях:
| Сценарий | Рекомендуется ли сабсеттинг | На что обратить внимание | Рекомендуемый инструмент |
|---|---|---|---|
| Архивирование и рассылка финальной версии | Настоятельно рекомендуется | После сабсеттинга нельзя добавлять новые символы | SmartSlim |
| Корпоративное пакетное архивирование | Настоятельно рекомендуется | Автоматизация через API | SmartSlim 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 и др.), локальная обработка — данные не покидают контур.