Извлечение текста из искаженного PDF

У меня есть файл PDF с ценной текстовой информацией.

Проблема в том, что я не могу извлечь текст, все, что я получаю, это набор искаженных символов. То же самое произойдет, если я скопирую и вставлю текст из программы чтения PDF в текстовый файл. Даже Файл -> Сохранить как текст в Acrobat Reader не работает.

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

Мои вопросы:

  • В чем причина этого странного искажения текста?
  • Как извлечь текстовое содержимое из PDF-файла (программно, с помощью инструмента, манипулируя битами напрямую и т. д.)?
  • Как исправить PDF, чтобы он не искажал копию?

person SNAG    schedule 29.08.2012    source источник
comment
Я переработал вопрос, так как он идеально подходит для SO, действительно файлы PDF являются распространенным форматом файлов для автоматического извлечения текста, и ответы уже прекрасно отвечают, как программно проверить эту проблему и исправить ее (я также могу добавить ответ с фрагмент кода для OCR). Я голосую за повторное открытие вопроса, поскольку он может оказаться полезным для других разработчиков.   -  person gaborous    schedule 17.02.2017


Ответы (3)


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

Такие файлы будут нормально отображаться и печататься (поскольку формы символов определены правильно), но текст из них не может быть правильно скопирован/извлечен (поскольку нет информации о значении используемых глифов/форм).

Например, Distiller создает такие файлы, когда используется предустановка «Наименьший размер файла».

Боюсь, кроме OCR нет другого способа извлечь текст из таких файлов. Недавно мы опубликовали руководство по распознаванию PDF-файлов в .NET.


Дополнение к исходному ответу

В исходном ответе упоминалась информация о значении используемых глифов/фигур. Эта информация должна содержаться в структуре PDF, называемой таблицей /ToUnicode. Такая таблица требуется для каждого шрифта, который встраивается как подмножество и использует нестандартную (Custom) кодировку.

Чтобы быстро оценить шансы извлечения текстового содержимого, вы можете использовать утилиту командной строки pdffonts. Это печатает в табличной форме ряд элементов о каждом шрифте, используемом PDF. На наличие таблицы /ToUnicode указывает столбец с заголовком uni.

Несколько примеров вывода:

$ kp@mbp:git.PDF101.angea> pdffonts handcoded/textextract/textextract-good.pdf

    name                     type        encoding   emb sub uni object ID
    ------------------------ ----------- ---------- --- --- --- ---------
    BAAAAA+Helvetica         TrueType    WinAnsi    yes yes yes     12  0
    CAAAAA+Helvetica-Bold    TrueType    WinAnsi    yes yes yes     13  0


$ kp@mbp:git.PDF101.angea> pdffonts handcoded/textextract/textextract-bad1.pdf

    name                     type        encoding   emb sub uni object ID
    ------------------------ ----------- ---------- --- --- --- ---------
    BAAAAA+Helvetica         TrueType    WinAnsi    yes yes no      12  0
    CAAAAA+Helvetica-Bold    TrueType    WinAnsi    yes yes no      13  0


$ kp@mbp:git.PDF101.angea> pdffonts handcoded/textextract/textextract-bad2.pdf

    name                     type        encoding   emb sub uni object ID
    ------------------------ ----------- ---------- --- --- --- ---------
    BAAAAA+Helvetica         TrueType    WinAnsi    yes yes yes     12  0
    CAAAAA+Helvetica-Bold    TrueType    WinAnsi    yes yes no      13  0

good.pdf позволяет правильно извлекать текстовое содержимое для обоих шрифтов, потому что оба шрифта имеют сопроводительную таблицу /ToUnicode.

Для bad1.pdf и bad2.pdf извлечение текста удается только для одного из двух шрифтов и не удается для другого, потому что только один шрифт имеет таблицу /ToUnicode.

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

person Bobrovsky    schedule 30.08.2012
comment
@SNAG В основном такие файлы не содержат информации о сопоставлении глифа с символом и в то же время используют нестандартные (не ASCII-подобные) кодировки; в отсутствие надлежащей информации о преобразовании глифа в символ многие средства извлечения текста предполагают некоторую стандартную кодировку и все равно пытаются извлечь. Всякий раз, когда это предположение не срабатывает, результатом является мусор. - person mkl; 30.08.2013
comment
Я проголосовал за ваш ответ, а также дополнил его некоторой информацией. Я надеюсь, что это приемлемо для вас :-) - person Kurt Pfeifle; 06.04.2015
comment
Я также проголосовал за повторное открытие OP (который был закрыт по какой-то неясной причине). - person Kurt Pfeifle; 06.04.2015
comment
@KurtPfeifle Конечно, спасибо за дополнение. - person Bobrovsky; 06.04.2015
comment
Как в этом случае вы извлечете содержимое или извлечете шрифты, а затем примените их к содержимому, извлеченному без шрифтов? - person Chetan Bhasin; 01.09.2015

Я обратился ко многим людям за помощью, и OCR — единственное решение этой проблемы.

person SNAG    schedule 31.08.2012
comment
Если вы используете Microsoft Office, OneNote имеет очень приличное распознавание символов, которое для меня работало со 100% точностью для PDF-документа, демонстрирующего вышеупомянутую проблему. - person David Airapetyan; 01.06.2015
comment
мне нравится, насколько сумасшедшее это решение .. :))))) - person nicolas; 04.05.2016
comment
что такое ОКР. не могли бы вы объяснить немного. У меня точно такая же проблема. - person Sodhi saab; 14.11.2017
comment
Оптическое распознавание символов @Sodhisaab. Я использовал github.com/tesseract-ocr/tesseract. - person SNAG; 22.11.2017

У меня такая же проблема. Загрузка его на Google Диск, открытие с помощью Google Docs и копирование текста оттуда сработало для меня.

person knutson    schedule 19.11.2014
comment
Более простое решение: перетащите PDF-файл в хромированное окно. Вы можете скопировать текст - по крайней мере, я мог - person gsziszi; 19.09.2016
comment
Работал на меня. Этот ответ кажется более практичным, чем ответы OCR (за исключением создания какой-либо автоматизации). (Метод Chrome от gsziszi у меня не сработал). - person Steph Thirion; 04.01.2017
comment
@gsziszi Не могли бы вы сделать свой комментарий ответом? Это работает и, очевидно, более практично, чем использование OCR. Спасибо! - person keyboardSmasher; 10.03.2017
comment
так как этот вопрос закрыт, невозможно добавить больше ответов - person gsziszi; 10.03.2017
comment
не работает для меня, как вы сказали. Я пробовал как открывать файл в окне Chrome, так и загружать его на диск Google и открывать оттуда - person Waqas Shakeel; 24.12.2018
comment
К сожалению, это не та же проблема, что и исходный вопрос. Реальная проблема описана здесь: forums.adobe.com/thread/915012 - person Edhowler; 31.01.2019
comment
Google Диск + Google Документы сработали для меня! - person Curt Williams; 06.09.2020