Ошибка отображения шрифта PDF - PullRequest
2 голосов
/ 21 августа 2011

При рендеринге PDF-файла, созданного PDFCreator 0.9.x.Я заметил, что он содержит ошибку в сопоставлении символов.Теперь об ошибке в файле PDF нечего удивляться, Acrobat творит чудеса при отображении неисправных файлов PDF, поэтому многие генераторы PDF создают файлы PDF, которые не полностью соответствуют стандарту PDF.

Я краткосоздайте небольшой файл примера: http://test.continuit.nl/temp/Document.pdf

На одной странице отображается один глиф (заглавная A) с помощью команды Tj (см. поток 5 0 obj).Выбранный шрифт (7 0 объектов) содержит шрифт с одним встроенным глифом.Все идет нормально.На char ссылается char # 1.Учитывая кодировку шрифта, он содержит часть «Различия»: [1 / A].Таким образом char 1 -> символ / A.Теперь во встроенном шрифте подмножества есть cmap, который не соответствует глифу в символе 65 (например, заглавная A), раздел cmap шрифта действительно определяет символ в точном порядке в файле PDF Font -> Encoding -> Differences array.

Похоже, что отображение / кодирование символов выполняется дважды.Похоже, что затрагиваются только файлы из PDFCreator 0.9.x.

Мой вопрос: правильно ли это (или я допустил ошибку и является ли PDF правильным) и что бы вы сделали, чтобы обнаружить эту ситуацию, чтобырешить проблему с рендерингом.

Примечание: мне нужно иметь возможность рендерить эти PDF-файлы ..

Решение

В файле ISO32000 естьпримечание, что для символических шрифтов TrueType (флаговый бит 3 включен в дескрипторе шрифта) кодировка не разрешена, и вы должны игнорировать ее, всегда используя простую кодировку 1on1.В общем, если это символический шрифт, я полностью игнорирую объект Encoding, и это решает проблему.

1 Ответ

2 голосов
/ 22 августа 2011

Во-первых, файл открывается и корректно отображается в Acrobat, поэтому он почти уверен, что файл правильный. На самом деле он открывается и корректно отображается в широком диапазоне потребителей PDF, так что на самом деле это правильно.

Шрифт, о котором идет речь, - это шрифт TrueType, так что на самом деле да, есть два вида «кодирования». Во-первых, это кодировка PDF / PostScript. Это отображает код символа в имя глифа. В вашем случае он сопоставляет код символа 1 с именем глифа / A.

В шрифте PostScript мы ищем имя / A в словаре CharStrings, и это дает нам описание символа, которое мы затем выполняем. Однако с шрифтом TrueType все иначе.

Вы можете найти это на странице 430 Справочного руководства 1.7 PDF, где говорится, что:

"Встроенная кодировка программы шрифтов TrueType отображается непосредственно из кодов символов в описания глифов с помощью внутренней структуры данных, называемой« cmap »(не путать с CMap, описанным в Разделе 5.6.4,« CMaps »). ). "

В вашем случае я считаю, что вам просто нужно использовать код символа (0x01) непосредственно в подстоле CMAP. Это даст вам GID 36.

...