2010-06-14 1 views
6

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

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

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

Вопросы:

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

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

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

  • Убедитесь, что это 'голова', 'hhea', 'MAXP' и в разделе 'OS/2'.
  • Если у нас есть шрифт символа, очистите поля Panose и Unicode в разделе «OS/2»
  • Заполните правильные значения для WInAscent/Desc и TypoAsc/Desc, если они равны нулю.
  • Заполните допустимые значения для положений и размеров супер/подстроки/подчеркивания.
  • Сканировать все глифы, которые оставлены, и заполнить минимальные/максимальные значения X/Y в голове.
  • Перестройте раздел имени с информацией из файла PDF, из которого оно было получено.
+0

PDFCreator опирается на Ghostscript для создания PDF. Входом PDFCreator является PostScript, который (в Windows) обычно выводится как вывод драйвера принтера PostScript (чаще всего, драйвер PS от Adobe). Итак, вопрос: вы полностью контролируете свой рабочий процесс? Или вам нужно обрабатывать PDF-файлы, которые были созданы PDFCreator где-то, когда-то вне вашего контроля? Если вы находитесь под полным контролем, вы можете настроить рабочий процесс PDFCreator для встраивания оригинальных шрифтов TrueType, используемых в исходном (не-PostScript) формате документа, вместо того, чтобы рабочий процесс конвертировал шрифты в PS Type1. –

+0

@pipitas: исходные PDF-файлы считаются «вне нашего контроля». В настоящее время у нас есть руководство, в котором говорится: при использовании PDFCreator не используйте встроенные шрифты. Основная причина, по которой я * действительно хочу решить эту проблему, - это полное понимание требований загрузки шрифтов TrueType для Windows. Если я смогу использовать GDI для рисования текста, я могу избежать в зависимости от других библиотек DLL, библиотек с их лицензиями и патентных вопросов и т. Д. Но в конце концов мне очень нравится решать эту проблему, хотя теперь она ниже в списке prio из-за к руководству. –

+0

Хорошо, если ваша проблема возникает главным образом с выходом PDFCreator, но вам не разрешается «исправлять» причину этой проблемы в ее корне (глупой директивой, которая гласит: «Не делайте для своих PDF-файлов, что все последние усилия по стандартизации [ PDF/X, PDF/A] рекомендуется [а именно, встраивание шрифтов]! », То я в тупик ... –

ответ

3

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

Шрифт рода (символ или нет) должны быть одинаковыми для «CMAP» таблицы и «имя» таблицы. Поэтому, если cmap имеет 3,0,4 cmap (MS, символ, дельта-кодирование сегмента), а таблица имен содержит записи в 3,1, $ 0409 (MS, Unicode, enUS), шрифт не загружается.

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

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

+0

Я просто смотрел вокруг, и кажется, что WPF может иметь это также в .NET 4.0 с использованием 'PresentationCore' в качестве ссылки: http://msdn.microsoft.com/en-us/library/system.windows.media.glyphtypeface .symbol.aspx –

+0

У меня нет большого опыта работы с WPF, но кажется/похоже, что вы можете использовать шрифты OpenType, которые не имеют cmap, и вы обращаетесь к глифам на глифиде. Если вы попытаетесь сделать это в GDI, это не сработает. Спасибо, что указали это. –

+0

Я не так много вникнул в это, но я столкнулся с [этот документ по выбору шрифтов в WPF] (http://blogs.msdn.com/b/text/archive/2007/04/23/wpf -font-selection-model.aspx), который очень подробно показывает, как WPF определяет шрифты из таблиц. Это интересно читать. –

3

С AddMemoryFont в GDI +, вы можете проверить это Status за любые ошибки в шрифте памяти, как NotTrueTypeFont, например.

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

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

+0

Эта функция/status не предоставляют достаточной информации, чтобы понять, почему это считается истинным шрифтом truetype. Я пытаюсь предоставить программу шрифтов truetype, которая соответствует требованиям (все необходимые таблицы присутствуют и т. Д. И т. Д.), Но почему-то я не вижу, что отсутствует/неправильно. Кроме того, я использую GDI, а не GDI +, но если бы мог получить информацию о том, что мне нужно, чтобы изменить шрифт и заставить все работать ... Где-то в реализации GDI для загрузки шрифтов truetype программа шрифтов отклоняется, и я хочу знать, почему поэтому я могу изменить его и использовать встроенный шрифт. –

+0

Ах, извините за GDI +. Да, GDI проверяет только определенное количество вещей. Я обновил ответ выше. –

+0

Я попробовал MergeFontPackage, чтобы разорвать правильный шрифт или получить некоторые указания, что с ним не так. И вуаля .. никаких ошибок мы получили новый файл шрифта. К сожалению, это не сработало; Еще лучше, созданный им пакет шрифтов был одним и тем же байтом для байта. Так что это не дало мне понять, что было не так с программой шрифтов плюс не дало читаемой программы шрифтов. Я попробую TTLoadEmbedded, чтобы посмотреть, что это принесет мне завтра. –

 Смежные вопросы

  • Нет связанных вопросов^_^