Установка символов Юникода в потоке внешнего вида аннотаций с использованием Arial Unicode правильно отображает символы в Chrome, но не в Firefox. Любая идея по этому поводу? Поток появления аннотаций показан ниже. Например, чтобы показать символ галочки.
BT /F3 34 Tf 1.0 0.0 0.0 rg 107.44528 635.27405 Td [
<FEFF27132713>
] TJ ET
Скорее всего, ваш поток контента недействителен.
Если я вас правильно понял, вы хотите управлять кодировкой строкового параметра текста, показывающего инструкции в потоке содержимого 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». Как она создается? Как какой объект шрифта PDF? С помощью какой кодировки? То, что он «хорошо отображается в хроме», на самом деле может быть ошибкой Chrome, потому что ваш подход в целом приведет к недопустимому файлу или, по крайней мере, к тому, что не будут отображаться нужные вам символы.
Я использовал 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 Я подозреваю, что это связано с кодировкой.
«Я использовал…» — возможно, вы захотите уточнить, какую библиотеку и язык вы используете. На первый взгляд это похоже на PDFBox 2.x для Java, но я не совсем уверен. Поэтому, пожалуйста, уточните. Даже если я прав, укажите, какую именно версию PDFBox вы используете, в частности, это текущая версия 2.0.20 или 2.0.21 или она старше. При этом я по-прежнему считаю, что вы, скорее всего, создаете что-то недействительное, и программы просмотра PDF пытаются исправить это, некоторые так, как вы ожидали, некоторые иначе.
Его довольно старая версия 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
ссылка на шрифт здесь указывает на Arial unicode.
Название Arial Unicode не означает, что при его использовании вы должны использовать кодировку Unicode, это просто означает, что оно содержит глифы для большинства символов из Unicode Plane 0, также известного как Basic Multilingual Plane (BMP). Кодировка, используемая для обработки этого шрифта, обычно не является UCS-2.
Я понятия не имею, как PDFBox 0.7.3 используется для кодирования составных шрифтов, поэтому я не могу здесь помочь. Я просто могу сказать, что был бы очень удивлен, если бы он использовал UCS-2/UTF-16 в качестве кодировки.
Я пробовал использовать тот же подход, что и showText. Ниже код работает последовательно. PDPageContentStream content = (инициализирован правильно);
Спасибо за ваш ответ. Здесь, в примере, F3 — это ссылка на шрифт, созданная для arial unicode. Я хочу написать поток появления аннотации (PDAppearanceStream) BT Td (текст) Tj ET . Здесь текстовая строка хорошо отображается для обычного текста (каждый символ — один байт). Но для символа, представленного двумя байтами, текст преобразуется в (?z?z) в потоке PDAppearance. И текстовая аннотация хорошо отображается в хроме. Но тот же pdf с аннотацией при просмотре в adobe/firefox показывает только ZZ.