Что такое встроенные шрифты в PDF
Вшитый шрифт хранится внутри PDF: файл несёт с собой описания глифов и открывается одинаково там, где этого шрифта не установлено. Невшитый существует в документе только именем и метриками, и открывающая программа подставляет что-то похожее — из-за чего строки уезжают, а таблицы перестают сходиться. Отсюда же берётся ошибка при попытке дописать кириллицу стандартным шрифтом: у него просто нет нужных букв.
Коротко о цифрах
- Стандартных шрифтов
- 14 — их разрешено не вшивать
- Подмножество
- имя вида ABCDEF+Roboto означает вырезанный набор глифов
- Наш шрифт для кириллицы
- Roboto, отдаётся со своего домена, около 110 КБ на начертание
- Порядок вызова
- fontkit регистрируется до встраивания шрифта, иначе pdf-lib падает
- Данные просмотрщика
- таблицы кодировок и метрики стандартных шрифтов, ~2,4 МБ, качаются по требованию
Вшит, не вшит, подмножество
Чаще всего в файл попадает не весь шрифт, а подмножество: только те глифы, которые на страницах действительно встретились. Такой шрифт легко узнать по имени вида ABCDEF+Roboto — префикс из шести букв как раз и означает вырезанный набор. Это компромисс: документ открывается одинаково везде, а вес растёт на десятки, а не на сотни килобайт.
Отдельная категория — четырнадцать стандартных шрифтов, которые по спецификации может не вшивать никто: Helvetica, Times, Courier и их начертания плюс два символьных. Программа обязана найти замену сама. Для латиницы это работает приемлемо, для кириллицы результат зависит от того, что установлено на конкретной машине.
Откуда берётся WinAnsi cannot encode
Стандартный Helvetica в PDF использует однобайтовую кодировку WinAnsi, в которой кириллических букв нет вовсе. Попытка нарисовать таким шрифтом слово по-русски или по-казахски заканчивается не кракозябрами, а прямой ошибкой: закодировать нечего.
Поэтому водяной знак, нумерация страниц, дата рядом с подписью и экспорт из редактора рисуются вшитым Roboto с кириллическим набором. Файлы шрифтов отдаются с нашего же домена: когда они грузились со стороннего CDN, политика безопасности запрещала запрос, код молча откатывался на Helvetica — и каждый кириллический текст ронял инструмент.
Когда шрифта нет у того, кто читает
- Просмотрщику нужны метрики четырнадцати стандартных шрифтов и таблицы соответствия для документов с предопределёнными кодировками — без них он не соберёт карту глифов.
- Мы возим эти данные с собой: около 2,4 МБ на диске, но качается только то, что понадобилось конкретному файлу.
- Пока их не было, извлечение текста на таких документах возвращало пустоту, а редактор сообщал пользователю неправильную причину: «в этом PDF нет текстового слоя».
- Вывод для практики: если документ уходит наружу, шрифты в нём должны быть вшиты — на чужой машине надеяться не на что.
Частые вопросы
Почему документ выглядит по-разному на двух компьютерах?
Скорее всего, шрифт не вшит: каждая машина подставляет свой ближайший аналог, а у него другая ширина букв. Строки съезжают, таблицы перестают сходиться, а число страниц иногда меняется.
Почему инструмент отказался написать текст по-русски?
Такое бывает, когда текст рисуется стандартным шрифтом с кодировкой WinAnsi: кириллицы в ней нет, и вместо искажённых букв библиотека честно бросает ошибку. Лечится встраиванием шрифта с нужным набором глифов.
Насколько встраивание увеличивает файл?
Подмножество из нескольких десятков глифов добавляет единицы килобайт, полный кириллический набор одного начертания — около сотни. За одинаковый вид на любом устройстве это небольшая цена.
Можно ли вшить шрифты в готовый PDF у вас?
Отдельного инструмента для этого нет. Наши тексты — водяной знак, нумерация, дата подписи — всегда рисуются вшитым шрифтом, но переделать чужой документ, где шрифт не вшит, они не могут.