Казахские буквы в PDF: почему вместо них квадраты
Казахский алфавит — это русская кириллица плюс девять пар: Әә, Ғғ, Ққ, Ңң, Өө, Ұұ, Үү, Һһ, Іі. Шрифт, уверенно покрывающий русский, эти девять пар может не содержать вовсе, и тогда просмотрщик рисует на их месте пустой прямоугольник. Вторая беда встречается при создании файла: базовые шрифты PDF не кодируют кириллицу в принципе, и попытка написать хоть слово обрывается ошибкой.
Коротко о цифрах
- Девять пар сверх русского алфавита
- Әә Ғғ Ққ Ңң Өө Ұұ Үү Һһ Іі — восемнадцать знаков
- Кодировка WinAnsi
- ни одной кириллической позиции — падает и на русском тексте
- Встроенный шрифт
- Roboto, четыре начертания, 1031 глиф в обычном; все девять пар на месте
- Способ встраивания
- сабсет — только использованные глифы
- Обязательный порядок
- регистрация fontkit до встраивания, иначе ошибка на первом вызове
Две разные поломки, которые путают между собой
Квадраты при просмотре означают, что шрифт в файл не встроен, а тот, которым просмотрщик его заменил, нужного знака не содержит. Русский текст при этом читается нормально — отсюда ощущение, что сломались именно казахские буквы. На самом деле сломалась подстановка шрифта, и на чужом устройстве картина может быть другой.
Ошибка при создании файла выглядит иначе: инструмент отказывается написать текст и сообщает, что кодировка не справляется. Причина в том, что четырнадцать базовых шрифтов PDF используют кодировку WinAnsi, а в ней кириллических позиций нет ни одной. Не «казахских букв не хватает» — не хватает всей кириллицы, включая обычное русское слово.
Как это решено у нас
- Вместо базового шрифта в документ встраивается Roboto: четыре начертания лежат на нашем же домене и отдаются вместе со страницей.
- Перед встраиванием регистрируется fontkit — без этого шага pdf-lib не умеет работать с внешним шрифтом и падает на первом же вызове.
- Шрифт встраивается сабсетом: в файл попадают только те глифы, которые реально использованы, поэтому вес растёт незначительно.
- Все девять казахских пар в этих начертаниях присутствуют — проверено разбором самих файлов шрифта, а не на глаз.
- Раньше шрифты подтягивались со стороннего адреса, и политика безопасности страницы блокировала запрос: происходил молчаливый откат на базовый шрифт, а за ним ошибка кодировки. Собственный домен убрал этот класс отказов целиком.
Где встроенный шрифт спасает положение
- Водяной знак с казахским текстом — самый частый случай: без встраивания операция обрывалась бы на первой же букве.
- Номера страниц вида «Бет 4»: слово перед числом подставляется на языке интерфейса.
- Дата рядом с подписью: она рисуется текстом, а не картинкой, поэтому кодировка для неё важна так же.
- Экспорт из редактора PDF, где вы правите или дописываете текст на казахском.
- Запекание форм: значения полей на казахском перерисовываются нашим шрифтом, тогда как стандартный путь на них падает.
Частые вопросы
Почему вместо ә и ғ показываются пустые квадраты?
Шрифт не встроен в файл, и просмотрщик подставил свой, в котором этих знаков нет. Пустой прямоугольник — это стандартный способ показать отсутствующий глиф. На другом устройстве с другим набором шрифтов тот же файл может выглядеть иначе.
Что означает ошибка про WinAnsi при добавлении текста?
Что текст пытались написать базовым шрифтом PDF, а его кодировка кириллицу не содержит вообще. Лечится только встраиванием шрифта с нужными глифами: подобрать другую кодировку из базового набора невозможно, кириллицы там нет ни в одной.
Как проверить, встроен ли шрифт в мой файл?
Откройте свойства документа в просмотрщике: там перечислены шрифты и отмечено, встроен ли каждый. Встроенный шрифт выглядит одинаково везде, невстроенный зависит от того, что найдётся на устройстве получателя.
Сильно ли встраивание шрифта увеличивает файл?
Незначительно, потому что встраивается не весь шрифт, а сабсет — только те знаки, которые встречаются в добавленном тексте. Для водяного знака или номеров страниц это десятки знаков, и прирост веса теряется на фоне самих страниц.