Программно копировать текст из PDF-файла (вручную) - отсутствует текст - PullRequest
3 голосов
/ 29 октября 2010

Примечание: меня не интересует использование библиотеки разбора. Это для моего собственного развлечения.

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

Обратите внимание, что это гораздо проще, чем прямой анализ; Мне все равно, если я случайно включу какой-то мусор в свой вывод, и мне не важно, не повреждено ли форматирование документа. Мне даже все равно, произнесутся ли слова в порядке.

В качестве первого шага я создал очень простой парсер pdf, используя стратегию этого проекта . По сути, все, что он делает - это ищет в PDF-файлах потоки zlib, выкачивает их и извлекает любой текст, найденный в скобках. Это не позволяет проанализировать данные, застрявшие в блоках << >>, но, насколько я понимаю, это относится к двоичным данным с шестнадцатеричным кодированием, которых нет в тестовом файле, который мне не удается проанализировать ... или в по крайней мере, я их не вижу.

Аналогично, iText.Net также не работает, хотя PDFMiner и PDFBox завершаются успешно. Однако последние два проекта имеют слишком много уровней косвенности, чтобы их можно было легко изучить; У меня были проблемы с выяснением, что именно они делают, отчасти потому, что я на самом деле не использую ни один из языков, чтобы привыкнуть к его отладке каким-либо существенным образом.

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

1 Ответ

14 голосов
/ 29 октября 2010

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

То, что вы пытаетесь сделать (извлечение строки в скобках), работает только с простой кодировкой WinAnsi или MacRoman, используемой со шрифтами Type1 или TrueType. К сожалению, эти однобайтовые кодировки не поддерживают надлежащий контент Unicode. Ваш образец документа использует шрифты Type0 или CID, где каждый символ идентифицируется индексом глифа. Это нестандартные специальные кодировки, в которых разработчик шрифта может произвольно назначить индекс глифа любому символу. Иногда производитель PDF намеренно искажает кодировку.

Как это работает, начиная с каталога, вы анализируете дерево страниц. Как только вы идентифицируете объект страницы, вы анализируете его содержимое и ресурсы. Словарь ресурсов содержит список шрифтов, используемых страницей. Каждый объект шрифта CID содержит поток ToUnicode, который является картой (символьной картой), которая устанавливает связь между индексами глифа и их значением Unicode. Например:

<01> <0044>
<02> <0061>
<03> <0074>
<04> <0020>

Это означает, что глиф 01 - это Unicode U + 0044, глиф 02 - это U + 0061 и т. Д. Вы должны использовать эту справочную таблицу для перевода идентификаторов глифов обратно в Юникод.

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

Другим интересным оператором является текстовое шоу (обычно TJ или Tj). С шрифтами Type0 (CID) Tj не содержит читабельного текста, а представляет собой последовательность идентификаторов глифов, которые вы должны отобразить в Unicode с помощью вышеупомянутого cmap. Часто Tj использует шестнадцатеричную строку, такую ​​как <000100a50056> Tj, вместо более типичного (Hello, World) Tj, с которым вы знакомы. В любом случае, строка не читается человеком и не может быть извлечена без полного анализа страницы, включая все ресурсы шрифта, особенно. карта ToUnicode, которая сама по себе является объектом PostScript, но вы заботитесь только о шестнадцатеричных частях.

Конечно, я упростил процесс, потому что существуют десятки различных стандартных кодировок, пользовательских кодировок (дифференциальных или ToUnicode), и мы даже не затрагивали арабский, хинди, вертикальные японские шрифты, шрифты типа 3 и т. Д. Иногда текст вообще не может быть извлечен, потому что он преднамеренно искажен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...