Этот файл содержит текст в формате юникод который будет потерян что делать

Обновлено: 04.07.2024

Моя программа генерирует относительно простые PDF-документы по запросу, но у меня проблемы с символами Юникода, такими как кандзи или нечетные математические символы. Чтобы записать обычную строку в PDF, вы помещаете ее в квадратные скобки:

Также есть возможность экранировать символ восьмеричными кодами:

Но это только до 512 символов. Как вы кодируете или экранируете высшие символы? Я видел ссылки на байтовые потоки и строки в шестнадцатеричной кодировке, но ни одна из прочитанных мной ссылок, похоже, не рассказывала мне, как на самом деле это делать.

Изменить: в качестве альтернативы укажите мне хорошую библиотеку Java PDF, которая сделает всю работу за меня. В настоящее время я использую версию gnujpdf (в которой я исправил несколько ошибок, поскольку исходный автор, похоже, ушел в самоволку), которая позволяет вам программировать с использованием интерфейса AWT Graphics, и в идеале любая замена должна делать такой же.

Альтернативой может быть либо HTML -> PDF, либо программная модель, основанная на абзацах и блоках, которая очень похожа на HTML. iText является примером последнего. Это означало бы переписать существующий код, и я не уверен, что они дадут мне такую ​​же гибкость в компоновке.

Редактировать 2: я раньше не понимал, но библиотека iText имеет Graphics2D API и, кажется, отлично справляется с юникодом, поэтому я буду использовать именно его. Хотя это не ответ на заданный вопрос, он решает проблему для меня.

Редактировать 3: Мне нравится iText. Думаю, урок в том, что, сталкиваясь с чем-то, что кажется бессмысленно трудным, ищите кого-то, кто знает об этом больше, чем вы.

Помимо обертывания строк с помощью () , вы также можете использовать <> . В gt / lt вы используете шестнадцатеричные числа, а не буквы. Гораздо менее эффективен, но вам не нужно беспокоиться о побегах. <FEFF00480065006C006C006F00200077006F0072006C00640021> : "Привет, мир!" как строку Unicode-16. Пост плинтуса тоже важен . НЕОБХОДИМО использовать FE FF. FFFE - это плохо. По какой-то причине. : / @MarkStorer, это должно быть FEFF , потому что это должно быть UTF-16BE. Они работают для меня (дайте áéíóú правильно) \ 341 \ 351 \ 355 \ 363 \ 372, но это не \ 527 \ 777 (они отображаются как Wÿ) - есть ли способ узнать, с какими из них будут работать, например >

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

В справочнике PDF в главе 3 о Unicode говорится следующее:

Текстовые строки кодируются в кодировке PDFDocEncoding или Unicode. PDFDocEncoding является расширенным набором кодировки ISO Latin 1 и задокументирован в Приложении D. Unicode описан в стандарте Unicode Консорциумом Unicode (см. Библиографию). Для текстовых строк, закодированных в Unicode, первые два байта должны быть 254, за которыми следует 255. Эти два байта представляют маркер порядка байтов Unicode, U + FEFF, что указывает на то, что строка закодирована в схеме кодирования UTF-16BE (big-endian). указан в стандарте Unicode. (Этот механизм предотвращает начало строки с использованием PDFDocEncoding с двух символов thorn ydieresis, что вряд ли будет значимым началом слова или фразы).

Я знал, что это звучит слишком хорошо, чтобы быть правдой. «Текстовые строки» используются для метаданных документа (аннотации, названия закладок), не для отображаемого текста! По крайней мере, в справочнике PDF 1.7 оператор текстового отображения текстового объекта ( BT ) ( Tj ) явно говорит: «Показать текстовую строку». Это означает, что они могут быть закодированы в UTF-16BE, как описано. Это не сработает автоматически. Кодировка строк может быть UTF-16BE только в том случае, если шрифт поддерживает ее (фактически, это должен быть шрифт CID со значением ToUnicode и несколькими другими элементами). Есть одна деталь, которую я не могу осмыслить: можно ли использовать UTF-16BE вместе с синтаксисом (text string) ? Этот синтаксис подразумевает, что однобайтовый символ ) является маркером завершения. А как насчет кодовых единиц UTF-16BE, где старший байт имеет значение 29h ? Нужно ли было сбежать от всего этого? Или UTF-16BE требует использования шестнадцатеричных строк ( <hex string> )?

Ответ Algoman во многих отношениях неверен . Вы можете создать PDF-документ с Unicode в нем, и это не ракетостроение, хотя и требует некоторой доработки. Да, он прав, чтобы использовать более 255 символов в одном шрифте, вам нужно создать объект pdf составного шрифта (CIDFont). Затем вы просто указываете фактический шрифт TrueType, который хотите использовать в качестве записи DescendatFont в CIDFont. Хитрость в том, что после этого вы должны использовать индексы глифов шрифта вместо кодов символов. Чтобы получить эту карту индексов, вам нужно проанализировать раздел шрифта cmap - получить содержимое шрифта с помощью функции GetFontData и взять в руки спецификацию TTF. Вот и все! Я только что это сделал, и теперь у меня есть PDF-файл в формате Unicode!

И да, не забывайте запись / ToUnicode, как указал @ user2373071, иначе пользователь не сможет выполнять поиск в вашем PDF-файле или копировать из него текст.

Как указал Дредкин, вы должны использовать индексы глифов вместо значения символа Юникода в потоке содержимого страницы. Этого достаточно для отображения текста Unicode в PDF, но текст Unicode не будет доступен для поиска. Чтобы сделать текст доступным для поиска или работать с копированием / вставкой, вам также необходимо включить поток / ToUnicode. Этот поток должен преобразовывать каждый глиф в документе в фактический символ Юникода.

См. Приложение D (стр. 995) спецификации PDF. В потребительском приложении PDF есть ограниченное количество шрифтов и наборов символов. Чтобы отобразить другие символы, вам нужно встроить шрифт, который их содержит. Также желательно встраивать только часть шрифта, включая только необходимые символы, чтобы уменьшить размер файла. Я также работаю над отображением символов Unicode в PDF, и это большая проблема.

Проверьте PDFBox или iText.

Я проработал несколько дней над этой темой и узнал, что юникод (почти) невозможен в pdf. Использование 2-байтовых символов, как описано для постамента, работает только с CID-Fonts.

По-видимому, CID-Fonts - это внутренняя конструкция pdf, и на самом деле они не являются шрифтами в этом смысле - они больше похожи на графические подпрограммы, которые можно вызывать, обращаясь к ним (с 16-битными адресами).

Итак, чтобы использовать Unicode в pdf напрямую

  1. вам придется преобразовать обычные шрифты в CID-Fonts, что, вероятно, чрезвычайно сложно - вам придется сгенерировать графические процедуры из исходного шрифта (?), извлечь метрики символов и т. д.
  2. вы не можете использовать CID-Fonts как обычные шрифты - вы не можете загружать или масштабировать их так, как вы загружаете и масштабируете обычные шрифты
  3. кроме того, 2-байтовые символы даже не покрывают все пространство Unicode

IMHO, эти моменты делают абсолютно невозможным использование Unicode напрямую .

Вместо этого я сейчас использую символы косвенно следующим образом: Для каждого шрифта я создаю кодовую страницу (и таблицу поиска для быстрого поиска) - в C ++ это будет что-то вроде

Затем, когда я хочу поместить некоторую строку Unicode на страницу, я повторяю ее символы, ищу их в таблице поиска и - если они новые, я добавляю их на кодовую страницу следующим образом:

Затем я генерирую новую строку, в которой символы из исходной строки заменяются их позициями в кодовой странице следующим образом:

Например, «Привет, мир!» может стать , и теперь вы можете просто поместить эту строку в pdf и распечатать, используя оператор Tj, как обычно .

Но теперь у вас есть проблема: PDF-файл не знает, что вы имеете в виду "H" под 01. Чтобы решить эту проблему, вы также должны включить кодовую страницу в PDF-файл. Это делается путем добавления / Encoding к объекту Font и установки его Различий .

За "Здравствуй, мир!" Например, этот Font-Object будет работать:

Я генерирую его с помощью этого кода:

Обратите внимание, что я использую глобальный регистр шрифтов - я использую одни и те же имена шрифтов / F1, / F2, . во всем документе PDF. Один и тот же объект регистра шрифта упоминается в записи / Resources на всех страницах. Если вы сделаете это по-другому (например, вы используете один регистр шрифтов на странице), вам, возможно, придется адаптировать код к вашей ситуации .

Так как же найти названия глифов (/ Euro вместо «€», / exclam для «!» И т. Д.)? В приведенном выше коде это делается простым вызовом «GlyphName (* j)». Я создал этот метод с помощью BASH-скрипта из списка, найденного на

И это выглядит так

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

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

Подскажите что делать! Понятия не имею, но почему-то у меня стали все текстовики(даже блокнот) кодировать русские буквы. Если я ввожу русский текст и нажимаю сохранить, то всплывает ошибка "Этот текст содержит текст в формате Юникод, который будет потерян, если вы сохраните этот файл как файл в формате ANSI. Чтобы сохранить данные в формате Юникод, нажмите кнопку "Отмена" и выберите один из вариантов сохранения в формате Юникод."

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Ввести строку В разных строках распечатать: все маленькие буквы, все большие, все цифры
Помогите пожалусто Нужно сделать на Assembler программу принимающую буква пока до тех пор пока не.


Переставить элементы массива так, чтобы сначала располагались все 2, потом 3, затем все 4 и, наконец, все 5
В Массиве X(5,7), Каждый элемент равен 2,3,4 или 5 переставить элементы массива так чтобы сначала.

Поменять местами значения массива так, чтобы сначала располагались все 0, затем все 1 и, наконец, все 2
В массиве каждый элемент равен 0, 1 или 2(размер массива не важен). Поменять местами значения.

Участие в Open Source,KDE, проекты, qtbase5-dev и всё всё всё
Адресовано к разработчикам, кто на линуксе участвует в разработке опен-сорс прог. В общем.


Переставить элементы массива так, чтобы располагались все нули, затем все единицы, и, наконец, все двойки
Помогите пожалуйста решить задачу: В массиве х(12) каждый элемент равен 0, 1 или 2. Переставить.


Переставить элементы массива так, чтобы сначала располагались все единицы, затем все двойки и, наконец, все нули
Ребят помогите пожалуйста В массив x(N) каждый элемент равен 0,1 или 2. Приставить элементы.


Переставить элементы массива так, чтобы сначала располагались все нули, затем все двойки и, наконец, все единицы
Добрый день ! У меня к вам просьба. Помогите решить задачу по с++ начинающему чайнику. :wall.

Читайте также: