Ответ 1
Я просмотрел ваш файл с помощью различных инструментов:
- qpdf (Джей Бэркенбитт) для анализа файла.
- pdfid.py и pdf-parser.py (Дидье Стивенс), чтобы проанализировать больше.
- PDFlib TET (инструмент извлечения текста), чтобы попытаться извлечь текст.
- PDFlib Репортер шрифтов Плагин Acrobat {, Reader} для создания таблицы с глифами, используемыми PDF.
- утилита командной строки Poppler
pdffonts
.
Даже TET не удалось извлечь текст. И TET - лучшее, что я знаю для этой задачи - часто удается, когда другие методы терпят неудачу.
Мой анализ дал мне следующие результаты:
-
pdffonts
дает первый быстрый обзор. Он возвращает следующую информацию:$ pdffonts "so#12703387-problem.pdf" name type encoding emb sub uni object ID ------------------------- ------------ ----------- --- --- --- --------- YLWHHJ+FrenchScriptMT Type 1C Custom yes yes no 14 0
Столбец
uni
должен содержать записьyes
.no
в этом столбце указывает, что в шрифте, используемом PDF, отсутствует таблица/ToUnicode
. Этот шрифт встроен в подмножество под названиемYLWHHJ+FrenchScriptMT
. Он также использует кодировку шрифтаCustom
(скорее всего, используя массив/Differences
). Без правильной и полной таблицы/ToUnicode
будет невозможно правильно извлечь текст. -
Создатель PDF, используемый для создания этого PDF, был PDFCreator версии 1.0.2 на основе очень старой версии Ghostscript 8.70. (Об этом свидетельствует запуск
"pdfinfo so#12703387-problem.pdf"
.) -
Используемый шрифт - это подмножество FrenchScriptMT, содержащее 94 разных глифа.
-
Кодировка шрифта "Пользовательская", используя массив
/Differences
. -
Текстовый чертеж в PDF преимущественно использует оператор
TJ
, который позволяет индивидуально позиционировать глиф. -
Все операции рисования текста широко используют функцию "индивидуального позиционирования глифа". Почти все глифы расположены индивидуально, как вы можете видеть из этого фрагмента кода (первое вхождение
TJ
):[<01>-3.18894<02>3.62397<02>3.62397<03>-2.42535<04>3.12889<05>3.88047<06> -14.1669<07>-3.7221<02>-4.37556<04>3.62397(\b)-4.88286(\t)3.88047<01> -3.18874(\n)1.29105<06>-13.6718(\b)-4.88245<0b>1.78573<02>3.1293<06> -21.6714<04>3.62438(\f)0.553714(\r)0.0464142<0e>-1.28494<0f>-0.448671<10> 3.88007<06>-21.6714(\b)-4.88245<0b>1.78573<02>3.1293<06>-13.6718<11> 0.0920142<02>-4.37515<04>3.62438(\b)2.622<06>-13.6718<03> -10.4245(\t)3.88007<11>0.0920142<02>3.62438<12>-6.14134(\b)3.11708<13> 3.3858<14>0.0455999<15>-7.42628<06>-14.1669<16>2.90048(\r)0.0455999<17> -1.88425(\r)0.0455999<0b>1.78654(\r)]TJ
-
Как видно из "6.", операции рисования текста не используют "последовательность буквенных символов, заключенных в круглые скобки()", но используют "шестнадцатеричные данные, заключенные в угловые скобки", > '(см. Спецификация PDF, раздел 7.3.4.1).
-
Шестнадцатеричные значения для имен символов не соответствуют именам символов (хотя они должны быть получены из WinAnsiEncoding).
Сначала нужно сначала найти таблицу пользовательских кодировок.
Для этого я использовал команду
pdf-parser.py -s encoding so#12703387-problem.pdf
. Результат:<< /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 1 /g81 /g72 /g71 /g86 /g30 /g3 /g53 /g87 /g76 /g74 (... skipping some lines of output ...) /g32 /g170 /g105 /g103 /g95 ] >>
-
Теперь, когда последняя точка раскрывает суть вопроса: Таблица кодировки шрифтов не использует стандартные имена символов. Вместо этого он использует
1
,/g81
,/g72
,.../g95
(всего 94 разных имени). -
Мое последнее замечание о именах глифов также подтверждается результатами модуля PDFlib FontReporter:
-
Нет автоматически работающего инструмента для извлечения текста (ничто из того, что я знаю, по крайней мере) может сделать головы и хвосты этого беспорядка. Человек-эксперт мог бы, но я даже не пытался (потому что это не помогло вам - см. Мое резюме для лучшей помощи).
-
Лучший способ, в общем, для автоматического извлечения текста для этого типа кодировок шрифтов - использовать OCR (оптическое распознавание символов). Однако в этом случае используемый шрифт ( "Французский Script MT" ) не будет работать с OCR.
-
В теории должно быть возможно добавить PDF-код к существующему файлу PDF, который фактически добавляет недостающую таблицу
/ToUnicode
. Я не знаю ни одного инструмента, который мог бы сделать это автоматически. Чтобы добавить это, необходимо:- переформатировать PDF файл, затем
- запись таблицы вручную, затем
- вставив его в нужное место PDF файла в виде объекта separte PDF, затем
- вставка записи, указывающей на эту таблицу, в словарь объектов шрифта и, наконец,
- обновить таблицу PDF
xref
с правильными смещениями байтов ко всем идентификаторам объектов, на которые повлияли изменения.
Резюме - Мой совет вам:
- Восстановите свой PDF.
- Если возможно, создайте PDFCreator на более поздней версии Ghostscript.
- Измените настройку PDFCreator, чтобы он больше не создавал подмножество шрифтов. Убедитесь, что исходный шрифт полностью встроен.
Тогда, скорее всего, проблема с кодировкой шрифта исчезнет, и вы сможете копировать текст из своего PDF файла.
Update:
Я создал 5 образцов PDF файлов с ручной кодировкой, которые вызывают проблему, вызванную отсутствующей или неправильной/управляемой таблицей /ToUnicode
в PDF файле. Эти образцы теперь привязаны к недавно созданному хранилищу