Изменение встроенного шрифта TrueType, чтобы его можно было использовать в Windows GDI

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

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

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

Вопросы:

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

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

Какие модификации сделаны на данный момент:

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

person Ritsaert Hornstra    schedule 14.06.2010    source источник
comment
PDFCreator полагается на Ghostscript для создания PDF. Ввод PDFCreator - это PostScript, который (в Windows) обычно возникает как вывод драйвера принтера PostScript (чаще всего это драйвер Adobe PS). Итак, вопрос: полностью ли вы контролируете свой рабочий процесс? Или вам нужно обрабатывать PDF-файлы, созданные PDFCreator, где-то вне вашего контроля? Если у вас есть полный контроль, вы можете настроить рабочий процесс PDFCreator для встраивания исходных шрифтов TrueType, используемых в исходном (не PostScript) формате документа, вместо того, чтобы рабочий процесс преобразовывал шрифты в PS Type1.   -  person Kurt Pfeifle    schedule 06.07.2010
comment
@pipitas: считается, что исходные PDF-файлы находятся вне нашего контроля. В настоящее время у нас есть руководство, в котором говорится: при использовании PDFCreator не используйте встроенные шрифты. Основная причина, по которой я действительно хочу решить эту проблему, заключается в полном понимании требований к загрузке шрифтов TrueType в Windows. Если я могу использовать GDI для рисования своего текста, я могу избежать зависимости от других dll, библиотек с их лицензиями и проблемами с патентами и т. д. и т. д. к руководству.   -  person Ritsaert Hornstra    schedule 07.07.2010
comment
Хорошо, если ваша проблема в основном связана с выводом PDFCreator, но вам не разрешено устранять причину этой проблемы в ее корне (из-за глупого руководства, которое гласит: «Не делайте для ваших PDF-файлов то, что все недавние усилия по стандартизации [PDF/X, PDF/A] рекомендуется [а именно, встраивание шрифтов]!, то я в тупике...   -  person Kurt Pfeifle    schedule 07.07.2010
comment
Я действительно хотел бы исправить, но все инструменты говорят, что шрифт, который у меня есть, действителен, и freetype может использовать его без изменений, но не GDI. И он не скажет мне, что, по его мнению, с ним не так. Что касается недавней стандартизации: они созданы для решения конкретных проблем точности/X и долговременного хранения/A, и это не та проблема, с которой мы сталкиваемся здесь. Возможность корректного отображения PDF даже с замещающим шрифтом подходит для этого приложения. Но в идеальном мире все встроенные программы шрифтов действительны, или я должен иметь возможность использовать встроенные программы шрифтов после простых модификаций. Этот случай не работает.   -  person Ritsaert Hornstra    schedule 07.07.2010


Ответы (2)


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

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

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

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

person Ritsaert Hornstra    schedule 15.06.2011
comment
я просто оглядывался, и кажется, что WPF может иметь это и в .NET 4.0, используя PresentationCore в качестве ссылки: msdn.microsoft.com/en-us/library/ - person Todd Main; 04.07.2011
comment
У меня нет большого опыта работы с WPF, но кажется/похоже, что вы можете использовать шрифты OpenType, у которых нет cmap, и вы адресуете глифы на glyphid. Если вы попытаетесь сделать это в GDI, это не сработает. Спасибо, что указали на это. - person Ritsaert Hornstra; 05.07.2011
comment
Я не особо вникал в это, но наткнулся на этот технический документ по выбору шрифтов в WPF, в котором очень подробно показано, как WPF определяет шрифты из таблиц. Это интересное чтение. - person Todd Main; 05.07.2011

С помощью AddMemoryFont в GDI+ вы можете проверить его < href="http://msdn.microsoft.com/en-us/library/ms534175(v=VS.85).aspx" rel="nofollow noreferrer">Статус для любых ошибок в шрифте памяти , например NotTrueTypeFont.

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

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

person Todd Main    schedule 18.06.2010
comment
Эти коды функции/состояния не предоставляют достаточно информации, чтобы понять, почему он не считается допустимым шрифтом truetype. Я пытаюсь предоставить программу шрифтов truetype, которая соответствует требованиям (присутствуют все необходимые таблицы и т. д.), но почему-то я не вижу, что отсутствует/неправильно. Кроме того, я использую GDI, а не GDI +, но если бы я мог получить информацию о том, что мне нужно изменить на шрифт и заставить все работать... Где-то в реализации GDI для загрузки шрифтов truetype программа шрифта отклонена, и я хочу знать, почему поэтому я могу изменить его и использовать встроенный шрифт. - person Ritsaert Hornstra; 18.06.2010
comment
Ах, извините за GDI+. Да, GDI проверяет только определенное количество вещей. Я обновил ответ выше. - person Todd Main; 18.06.2010
comment
Я попробовал MergeFontPackage, чтобы создать правильный шрифт или узнать, что с ним не так. И вуаля. Никаких ошибок, мы получили новый файл шрифта. К сожалению, это не сработало; еще лучше, созданный пакет шрифтов был одним и тем же байтом в байт. Так что это не дало мне понимания, что было не так с программой шрифта, плюс не дало читабельной программы шрифта. Я попробую TTLoadEmbedded, чтобы посмотреть, что это мне принесет завтра. - person Ritsaert Hornstra; 19.06.2010
comment
TTLoadEmbedded ожидает поток файла OTF (truetype с заголовком OTF перед ним). После создания именно такого файла в памяти и удаления всех ошибок он завершается ошибкой с сообщением E_ADDFONTFAILED (например, шрифт truetype распаковывается правильно, но диспетчер шрифтов Windows не может его загрузить. Так что до сих пор неизвестно, почему диспетчер шрифтов Windows не загружает файл что касается источника PDFCreator: я вижу, что PDF создается встроенным модулем Ghostscript, и я могу проверить результаты (например, что он сделал), так что это тоже не даст мне ответа. :-( Спасибо во всяком случае для приводит! - person Ritsaert Hornstra; 21.06.2010
comment
Ах, вот в чем проблема, если это Ghostscript. Не зная слишком много о GS, вполне вероятно, что GS работает в рамках преобразования в какой-то тип PostScript для поддержки формата Acrobat. Теперь это не столько вопрос об извлечении и нормализации шрифта с точки зрения GDI, сколько о GS и Acrobat. Я бы начал с исходного кода GS напрямую, например svn.ghostscript.com/ghostscript/ магистраль/gs/lib. - person Todd Main; 21.06.2010
comment
@Otaku: Моя проблема не в GS, а в том, что Windows не предоставила мне информацию, из-за которой он поверил, что программа шрифтов повреждена. То, что производит GS, читается тестовыми программами Freetype2, так что это просто придирчивость Windos GDI. - person Ritsaert Hornstra; 21.06.2010
comment
Опять же, я бы посоветовал вам искать решение не только в GDI. Freetype2 поддерживает многие форматы, которые GDI не поддерживает или поддерживает с трудом. Если он вообще поддерживается GDI, вы всегда можете протестировать в программе рендеринга шрифтов GDI, такой как Word 2007 (встроить шрифт в OPC, настроить отношения и создать текст, используя это) - я предполагаю, что вот что это не удастся. Мы говорим здесь о PDF, своего рода собственной маленькой мини-платформе — это может быть другой формат для PDF (шрифты Type 1 с CID-ключом) или такой радикальный способ, как превращение TTF в растровые глифы (которые GDI может получить, но это настоящая боль). - person Todd Main; 21.06.2010
comment
Я думаю, что в конечном итоге я буду использовать Freetype2. Основная причина награды: потому что я не понимаю, почему менеджер шрифтов GDI/Windows отказывается использовать рассматриваемый шрифт. Вероятно, это где-то один бит, который нужно изменить, и вуаля рабочий шрифт. Это уже работало для многих других встроенных шрифтов в средстве визуализации PDF. Основная причина, по которой я хочу использовать GDi, заключается в том, что я могу заменить процедуры слияния PDF, которые мне нужны, процедурой слияния PDF, где я рисую PDf в другой, и если я делаю это с помощью GDI и EMF, я получаю гораздо меньше и меньше. более чистый PDf (мне нужно хранить 300 тыс. PDF-файлов в год). - person Ritsaert Hornstra; 22.06.2010
comment
Я дал тебе награду, потому что ты действительно помог мне в моем расследовании. К сожалению, я не получил ответа на вопрос. В любом случае спасибо за все ваши предложения! - person Ritsaert Hornstra; 22.06.2010
comment
Спасибо, Ритсарт. Мне было бы интересно увидеть результаты с Freetype2. - person Todd Main; 22.06.2010
comment
Наконец я нашел ответ (хотя и с опозданием почти на год). Я никогда не использовал Freetype2, так что, вероятно, я никогда не буду использовать его теперь, когда он работает. - person Ritsaert Hornstra; 15.06.2011
comment
@Ritsaert Hornstra: Рад слышать, что ты наконец получил ответ. - person Todd Main; 16.06.2011