Аннотация PDF, содержащая символы Unicode (охватывающие два байта), не отображается в Firefox, но отлично работает в Chrome

Установка символов Юникода в потоке внешнего вида аннотаций с использованием Arial Unicode правильно отображает символы в Chrome, но не в Firefox. Любая идея по этому поводу? Поток появления аннотаций показан ниже. Например, чтобы показать символ галочки.

 BT /F3 34 Tf 1.0 0.0 0.0 rg 107.44528 635.27405 Td [

  <FEFF27132713>

 ] TJ ET
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Включение UTF-8 в jsPDF с помощью Angular
Включение UTF-8 в jsPDF с помощью Angular
Привет, разработчики, я предполагаю, что вы уже знаете, как экспортировать pdf через jsPDF. Если ответ отрицательный, то вы можете ознакомиться с моей...
0
0
468
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Скорее всего, ваш поток контента недействителен.

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

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

В простом шрифте каждый байт строки должен рассматриваться как отдельный код символа. Затем код символа следует искать в кодировке шрифта для выбора глифа, как описано в 9.6.5, «Кодировка символов».

В составном шрифте (PDF 1.2) для выбора глифов можно использовать многобайтовые коды. В этом случае один или несколько последовательных байтов строки должны рассматриваться как код одного символа. Длина кода и отображение кодов в глифы определяются в структуре данных, называемой CMap, описанной в 9.7, «Композитные шрифты».

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

Таким образом, в случае вашего примера этот шрифт F3

  • либо это простой шрифт с некоторой однобайтовой кодировкой, и ваша строка <FEFF27132713> содержит 6 отдельных кодов символов, каждый из которых представляет собой глиф, если таковой имеется,
  • или это составной шрифт, возможно, с многобайтовой кодировкой, и ваша строка <FEFF27132713> содержит до 6 отдельных кодов символов, каждый из которых представляет собой глиф, если таковой имеется.

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

Спасибо за ваш ответ. Здесь, в примере, F3 — это ссылка на шрифт, созданная для arial unicode. Я хочу написать поток появления аннотации (PDAppearanceStream) BT Td (текст) Tj ET . Здесь текстовая строка хорошо отображается для обычного текста (каждый символ — один байт). Но для символа, представленного двумя байтами, текст преобразуется в (?z?z) в потоке PDAppearance. И текстовая аннотация хорошо отображается в хроме. Но тот же pdf с аннотацией при просмотре в adobe/firefox показывает только ZZ.

priya surya 15.12.2020 10:33

«F3 — это ссылка на шрифт, созданная для Arial Unicode». Как она создается? Как какой объект шрифта PDF? С помощью какой кодировки? То, что он «хорошо отображается в хроме», на самом деле может быть ошибкой Chrome, потому что ваш подход в целом приведет к недопустимому файлу или, по крайней мере, к тому, что не будут отображаться нужные вам символы.

mkl 15.12.2020 13:16

Я использовал PDFont font = PDType0Font.load(new file("C:/arialuni.ttf") для загрузки шрифтов и использовал PDPageContentStream.setFont(font). Я пытаюсь установить поток внешнего вида для аннотации на этой странице PDF используя созданную ссылку на шрифт F3. Я мог видеть встроенный шрифт при открытии файла в Adobe. Это только текст аннотации, показывающий разные значения в Firefox и Adobe. В Chrome и Edge он отлично отображает символы. Например, текст аннотации «привет» отображается как KHOOR в firefox и Adobe, но отображается как hello в chrome и edge Я подозреваю, что это связано с кодировкой.

priya surya 15.12.2020 15:52

«Я использовал…» — возможно, вы захотите уточнить, какую библиотеку и язык вы используете. На первый взгляд это похоже на PDFBox 2.x для Java, но я не совсем уверен. Поэтому, пожалуйста, уточните. Даже если я прав, укажите, какую именно версию PDFBox вы используете, в частности, это текущая версия 2.0.20 или 2.0.21 или она старше. При этом я по-прежнему считаю, что вы, скорее всего, создаете что-то недействительное, и программы просмотра PDF пытаются исправить это, некоторые так, как вы ожидали, некоторые иначе.

mkl 15.12.2020 17:08

Его довольно старая версия pdfbox 0.7.3 и java. Да, вероятно, то, как я представляю текстовое содержимое в потоке внешнего вида, неверно. Меняю вопрос на более простой вопрос. Если мне нужно отобразить «привет», используя юникод и используя ссылку на шрифт, учитывая, что универсальный код для приветствия (104 101 108 108 111). как мы указываем поток появления в формате ниже. BT /F3 34 Tf 1,0 0,0 0,0 rg 107,44528 635,27405 Td () Tj ET Q

priya surya 17.12.2020 08:03

ссылка на шрифт здесь указывает на Arial unicode.

priya surya 17.12.2020 10:15

Название Arial Unicode не означает, что при его использовании вы должны использовать кодировку Unicode, это просто означает, что оно содержит глифы для большинства символов из Unicode Plane 0, также известного как Basic Multilingual Plane (BMP). Кодировка, используемая для обработки этого шрифта, обычно не является UCS-2.

mkl 17.12.2020 15:52

Я понятия не имею, как PDFBox 0.7.3 используется для кодирования составных шрифтов, поэтому я не могу здесь помочь. Я просто могу сказать, что был бы очень удивлен, если бы он использовал UCS-2/UTF-16 в качестве кодировки.

mkl 17.12.2020 15:56

Я пробовал использовать тот же подход, что и showText. Ниже код работает последовательно. PDPageContentStream content = (инициализирован правильно);

priya surya 18.12.2020 06:25

Другие вопросы по теме