Изменение встроенного шрифта TrueType, чтобы его можно было использовать в Windows GDI - PullRequest
6 голосов
/ 14 июня 2010

Я пытаюсь отобразить содержимое PDF в контексте устройства GDI (точнее, 24-битное растровое изображение). Синтаксический анализ потока PDF в объекты PDF и рендеринг команд PDF из словаря содержимого работает хорошо, включая отрисовку шрифтов.

Встроенные шрифты распаковываются из потоков FontFile и «загружаются» с помощью AddFontMemResourceEx. Теперь некоторые встроенные шрифты удаляют некоторые таблицы TrueType, которые нужны GDI, такие как таблица 'name'. Из-за этого я попытался изменить шрифт, проанализировав шрифт подмножества TrueType в его таблицах, и изменил те таблицы, в которых отсутствуют / отсутствуют данные, сгенерированы как можно более точные данные.

Я использую инструмент Microsoft Font Validator , чтобы увидеть, насколько «правильный» сгенерированный шрифт. Я все еще получаю несколько ошибок, например, для таблицы maxp значения max обычно слишком велики (это подмножество) или поле xAvgCharWidth не равно расчетному значению таблицы 'OS / 2', но это неверно, но это не мешает использовать другие встроенные шрифты. Шрифты, встроенные с использованием PDFCreator, являются проблемными.

Вопросы:

  1. Как я могу определить, что мне нужно перейти к файлу шрифта для того, чтобы GDI, чтобы иметь возможность использовать его?
  2. Есть ли другие проверки шрифтов? инструменты, которые могут дать мне понимание в то, что все еще не так с fontfile

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

Какие модификации сделаны до сих пор:

  • Убедитесь, что есть разделы «head», «hhea», «maxp» и «OS / 2».
  • Если у нас есть символьный шрифт, очистите поля Panose и Unicode в разделе «OS / 2»
  • Введите правильные значения для WInAscent / Desc и TypoAsc / Desc, если они равны нулю.
  • Заполните допустимые значения для позиций / размеров super / subscript / underline.
  • Сканирование всех оставленных глифов и заполнение значений X / Y min / max в голове.
  • Перестройте раздел имени с информацией из файла PDF, из которого он получен.

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Почти год спустя, но я нашел ответ:

Вид шрифта (символ или нет) должен быть одинаковым для таблицы 'cmap' и таблицы 'name'.Таким образом, если карта содержит 3,0,4 карты (MS, символ, дельта-кодирование сегмента), а таблица имен содержит 3,1, 0409 $ (MS, Unicode, enUS) записей, шрифт не будет загружен.

Похоже, что наличие символа cmap определяет, считается ли шрифт символьным шрифтом в Windows;Флаги в 'OS / 2', кажется, не имеют значения.

Так что, если шрифт кажется правильным с помощью Microsoft Font Validator, проверьте, совпадают ли поля символов / юникода в 'cmap' и 'name'таблиц.

3 голосов
/ 18 июня 2010

С помощью AddMemoryFont в GDI + вы можете проверить его Состояние на наличие ошибок в шрифте памяти, например NotTrueTypeFont.

Одним из вариантов GDI может быть попытка загрузить встроенный шрифт в документ / форму самостоятельно с помощью TTLoadEmbeddedFont , а затем проверить все ошибки, возвращаемые из сообщений об ошибках . Единственными функциями, которые предоставляют больше информации, чем эта, являются CreateFontPackage / MergeFontPackage и их коды ошибок , но я не вижу, как их можно использовать в ваша ситуация.

За исключением всего этого, была ли у вас возможность просмотреть исходный код PDFCreator (при условии, что вы используете открытый исходный код, а не коммерческий)?

...