PDF показывает неправильный символ вместо перевода строки - PullRequest
0 голосов
/ 28 июня 2018

Мое приложение создает PDF, но когда написанная пользователем строка содержит перевод строки (\ n), вместо этого отображается неправильный символ (в большинстве шрифтов отображается маленький квадрат)

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

Кодировка для символа 10 в шрифте Arial отсутствует.

«Квадратный символ» начал появляться, когда я начал встраивать шрифты, но, используя тот же онлайн-валидатор в старом PDF (без встроенных шрифтов), он выдает мне то же сообщение.

Ссылка на пример в формате PDF.
PS: ошибка возникает в Acrobat, Foxit Reader и Windows reader в Windows 8, но не в Chrome.

Любая помощь будет оценена, спасибо заранее!

1 Ответ

0 голосов
/ 29 июня 2018

Сами символы перевода строки в отображаемых строках являются ошибкой.

Подробно

Ваше приложение создает потоки содержимого страницы с такими инструкциями, как

1 0 0 1 15.1732 592.4547 Tm
(Test with line break
) Tj
1 0 0 1 15.1732 580.4547 Tm
(New Line.) Tj 

В частности, строковый аргумент первой инструкции Tj содержит байт 0x0a перед закрывающей скобкой.

Tj - оператор отображения текста. Если вы посмотрите в спецификации PDF, вы прочитаете, что

Строковый операнд оператора отображения текста должен интерпретироваться как последовательность кодов символов, идентифицирующих глифы, которые должны быть нарисованы.

(ISO 32000-1, раздел 9.4.3 Операторы отображения текста)

т.е. каждый байт в такой строке принадлежит последовательности байтов, образующей код символа для идентификации глифа из шрифта.

В вашем случае шрифт определяется как

<<
/Type /Font
/Subtype /TrueType
/BaseFont /Arial
/FirstChar 30
/LastChar 255
/Widths 4 0 R
/FontDescriptor 5 0 R
/Encoding /WinAnsiEncoding
>> 

т.е. кодировка WinAnsiEncoding , которая определена в Приложении D ISO 32000-1. Как вы увидите, здесь нет отображений для кодов символов ниже 040 = 0x20 = 32, определенных для этой кодировки, в частности, не для 0x0a, код символа, который вы используете.

Таким образом, сообщение об ошибке валидатора PDF является правильным:

Отсутствует кодировка для символа 10 в шрифте «Arial».

и средства просмотра PDF, показывающие некоторый «неправильный символ» (как вы его называете), просто пытаются найти смысл из недопустимого элемента 0x0a в строковом аргументе Tj .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...