Копирование + вставка текста на иврите из файлов PDF приводит к неправильному копированию последних букв

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

Я нашел этот вопрос, но решение не было найдено, и этот вопрос говорил только об одном конкретном последнем письме, которое было неправильно прочитано, и это было только ссылка на определенную библиотеку.

Я попытался скопировать и вставить как из Acrobat Reader, так и из Chrome PDF Viewer, но не удалось правильно скопировать содержимое с обоими.

Еще одна интересная вещь, которую я нашел, заключается в том, что когда вы нажимаете Ctrl+F в браузере (я пробовал это на chrome) и, например, выполняете поиск последней буквы "Pe", это даст результаты как для обычного "Pe", так и для конечного "Pe" "(и наоборот, при поиске обычного"Pe"), даже если у них разные кодовые точки (и разные коды в кодовой странице ANSI), что также странно. (Это одинаково для всех последних букв и соответствующих им обычных букв)

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

РЕДАКТИРОВАТЬ:
По просьбе weibeld я добавляю несколько скопированных слов и соответствующие им правильные слова. Я также добавлю их hexdump.

E1 F7 F8 1B    בקר.  # Should be בקרן (Final letter "Nun") Switches every 
final Nun with 1B instead of EF according to the windows 1255 code page.

F2 F1 F7 E9 E9 17 עסקיי. # Should be עסקיים (Final letter "Mem") Switches 
every final Mem with 17 instead of ED.  

Спасибо!

2 ответа

Решение

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

Если все, что вам нужно, - это восстановить текст в PDF, самое простое решение может заключаться не в том, чтобы изменить PDF, а в том, чтобы заменить неправильные коды на правильные после копирования текста из PDF.

Например, вставьте текст, скопированный из PDF в file а потом:

cat file | tr '\033' '\357' | tr '\027' '\355' >out_file

То есть один tr за каждое неверное последнее письмо. Число 033, 357 и т.д. - это только восьмеричные формы шестнадцатеричных байтов 1B, EFи т. д., что вы узнали с hexdump, Просто найдите оставшиеся отображения и добавьте их в цепочку. затем out_file должен содержать правильно закодированный текст, и вы можете открыть его в каком-либо текстовом редакторе с помощью Windows-1255.

В PDF Reference практически ничего не говорится о том, как правильно кодировать нелатинский текст не-CJK для извлечения текста (ничего не требуется для рендеринга глифов), но есть два основных способа сделать это: первый - иметь таблицу ToUnicode. (как для простых, так и для составных шрифтов), второе, для простых шрифтов, это указать словарь кодирования с массивом различий, идентифицирующий каждый глиф с именем из реестра Adobe (например, https://github.com/adobe-type-tools/agl-aglfn/blob/master/glyphlist.txt).

Кодировка Identity-H подразумевает составной (двухбайтовый) шрифт, который может иметь таблицу ToUnicode. Пользовательская кодировка подразумевает словарь кодирования с массивом различий. Стандартное кодирование подразумевает, что не было задано (или пользовательское) кодирование.

Сочетание всех трех вместе подразумевает очень запутанное происхождение.

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