Я пытаюсь преобразовать содержимое PDF в контекст устройства GDI (точнее, в 24-битное растровое изображение). Преобразование потока PDF в объекты PDF и рендеринг команд PDF из словаря содержимого работает хорошо, включая рендеринг шрифтов.
Встроенные шрифты распаковываются из своих потоков FontFile и «загружаются» с помощью AddFontMemResourceEx
. Теперь некоторые встроенные шрифты удаляют некоторые таблицы TrueType, необходимые для GDI, например, таблицу «имя». Из-за этого я попытался изменить шрифт, проанализировав шрифт подмножества TrueType в его таблицах и изменив те таблицы, в которых данные отсутствуют/отсутствуют, таблицы восстанавливаются с максимально возможной корректной информацией.
Я использую инструмент Microsoft Font Validator, чтобы увидеть, насколько "правильный" сгенерированный шрифт. Я все еще получаю несколько ошибок, например, для таблицы maxp максимальные значения обычно слишком велики (это подмножество) или поле xAvgCharWidth
не равно расчетному значению таблицы «OS/2» неверно, но это не так. запретить использование других встроенных шрифтов. Проблемными являются шрифты, встроенные с помощью PDFCreator.
Вопросы:
- Как я могу определить, что мне нужно изменить в файле шрифта, чтобы GDI мог его использовать?
- Существуют ли какие-либо другие инструменты проверки шрифтов, которые могут дать мне представление о том, что все еще не так с файлом шрифта?
При необходимости: я могу сделать исходный файл шрифта и измененный файл шрифта доступными для скачивания где-нибудь.
Какие модификации сделаны на данный момент:
- Убедитесь, что есть разделы «head», «hhea», «maxp» и «OS/2».
- Если у нас есть символьный шрифт, очистите поля Panose и Unicode в разделе «OS/2».
- Введите правильные значения для WInAscent/Desc и TypoAsc/Desc, если они равны нулю.
- Заполните допустимые значения для надстрочных/подстрочных/подчеркивающих позиций и размеров.
- Отсканируйте все глифы, которые остались, и заполните минимальные/максимальные значения X/Y в голове.
- Восстановите раздел имени с информацией из файла PDF, из которого он был получен.