Как извлечь текст из PDF? [закрыто]


152

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

Мы хотели бы, чтобы эти данные были выведены в xmlили jsonотформатированы. В настоящее время мы смотрим на PdfTextStream который кажется довольно хорошим, но хотел бы услышать опыт и предложения других людей.

Существуют ли альтернативы (коммерческие или бесплатные) для извлечения текста из pdf программно?



1
Для тех , кто нуждается что - то очень простое (нет информации позиции), это Perl регулярное выражение может быть достаточно: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Он просто ищет оператор Tj / TJ, который обозначает весь обычный текст в PDF.
Алекс Р

1
используйте библиотеку TomRoush PdfBox, это хорошо работает на Android
FaisalAhmed

Ответы:


113

Мне дали 400-страничный PDF-файл с таблицей данных, которые мне пришлось импортировать - к счастью, никаких изображений. Ghostscript работал на меня:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

Выходной файл был разбит на страницы с заголовками и т. Д., Но тогда было легко написать приложение для удаления пустых строк и т. Д. И впитать все 30 000 записей. -dSIMPLEи -dCOMPLEXне имеет никакого значения в этом случае.


37
На Linux и Cygwin команда gsвместо gswin64c. Работает отлично. Нет запатентованного платного дерьма. Это просто работает.
Янн

4
Да, отлично работает! Теперь я могу безнаказанно использовать «grep» в моих файлах pdf. Поскольку я могу читать лучше, чем читать, это победа! (:-) Upvote.
Дэвид Элсон

1
Единственная проблема, с которой я столкнулся, заключалась в использовании его в PDF-файлах со встроенными «старыми» шрифтами. Прекрасно работает для локально сгенерированных PDF-файлов, но сложнее с неизвестными источниками. В остальном отличный скриптлет.
Джон М

что делает -sDEVICE=txtwrite? Я не очень понимаю после прочтения Как использовать Ghostscript | Выбор устройства вывода
Ooker

Для вывода на стандартный вывод вместо сохранения в виде текстового файла используйте gswin64c -sDEVICE=txtwrite -o- input.pdf. Источник (слегка измененный мной): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH

33

С сегодняшнего дня я знаю это: лучшая вещь для извлечения текста из PDF-файлов - это TET, набор инструментов для извлечения текста. . TET является частью семейства продуктов PDFlib.com.

PDFlib.com - компания Томаса Мерца. В случае, если вы не узнаете его имя: Томас Мерц является автором «Библии PostScript и PDF».

Первое воплощение TET - это библиотека . Это, вероятно, может сделать все, что хотел Budda006, включая информацию о местоположении каждого элемента на странице. Да, и он также может извлекать изображения. Он объединяет изображения, которые фрагментированы на куски.

pdflib.com также предлагает еще одно воплощение этой технологии, плагин TET для Acrobat . И третье воплощение - это PDFlib TET iFilter . Это автономный инструмент для рабочих столов пользователей. Оба они бесплатны (как в пиве) для использования в личных некоммерческих целях.

И это действительно мощно. Это лучше, чем собственное извлечение текста Adobe. Он извлек текст для меня, где другие инструменты (в том числе Adobe) выплескивают только мусор.

Я только что протестировал автономный инструмент для настольных компьютеров, и то, что они говорят на своей веб-странице, правда. У него очень хорошая командная строка. Некоторые из моих «проблемных» тестовых файлов PDF с инструментом обработаны к моему полному удовлетворению.

Эта вещь будет теперь моей рекомендацией для всех сложных и сложных требований к извлечению текста в PDF.

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

Попробуйте.


32
Пробной версии не существует, а 440 долларов - это немного, чтобы «попробовать».
Рок Стрниша


Доступен ли этот сервис через API?
Барт

1
Я проверил это, он не распознает столбцы. Я отсканировал английскую таблоидную титульную страницу. Текст был разделен на 3 колонки на бумаге, но этот плагин смешал предложения в целом, что выглядело неряшливо. У бесплатного Ghostscript был точно такой же вывод.
NoWhereToBeSeen

1
@RedHotScalability: Также BTW, ТЕТ делает распознавать colums , если используется с правильными параметрами. Но я оставляю это амбициозному сценаристу JS в качестве упражнения, чтобы прочитать документацию и выяснить, как ...
Курт Пфайфл

29

Эффективный инструмент командной строки с открытым исходным кодом, бесплатный и доступный как в Linux, так и в Windows: просто с именем pdftotext. Этот инструмент является частью библиотеки xpdf.

http://en.wikipedia.org/wiki/Pdftotext


4
О sidenote: используйте -layoutпереключатель, чтобы сохранить таблицы, работает довольно хорошо.
Себастьян


12

Вот мое предложение. Если вы хотите извлечь текст из PDF, вы можете импортировать файл PDF в Google Docs, а затем экспортировать его в более удобный формат, например .html, .odf, .rtf, .txt и т. Д. Все это с помощью Drive API , Это бесплатно * и надежно. Взгляни на:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Поскольку это API отдыха, он совместим со ВСЕМИ языками программирования. Ссылки, которые я разместил выше, имеют рабочие примеры для многих языков, включая: Java, .NET, Python, PHP, Ruby и другие.

Я надеюсь, что это помогает.


2
Я использовал этот вариант, и я бы не рекомендовал его. Извлечение текста PDF в Google не так хорошо, как во многих альтернативах (особенно для неанглоязычных), и это тоже очень неопрятно.
Бьорн Линдквист

10

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

Кроме того, вы должны взглянуть на Apache PDFBox с открытым исходным кодом.


PdfTextStream не поддерживается в Android. Есть ли хорошие библиотеки, подобные этой, доступные для Android?
FaisalAhmed

@FaisalAhmed как насчет PDFBox?
Renaud

Да, PdfBox также не поддерживается в Android .... PdfTextStream и PdfBox используют некоторую часть awt, которая не поддерживается в Android
FaisalAhmed

я использую эту библиотеку, которая хорошо работает на Android github.com/TomRoush/PdfBox-Android
FaisalAhmed

6

Библиотека Docotic.Pdf может быть использована для извлечения текста из PDF файлов виде простого текста или в виде набора текстовых фрагментов с координатами для каждого фрагмента.

Docotic.Pdf также может быть использован для извлечения изображений из PDF-файлов .

Отказ от ответственности: я работаю на Bit Miracle.


6

Один из комментариев здесь использовал gs на Windows. У меня также был некоторый успех в Linux / OSX со следующим синтаксисом:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

Я использовал dSIMPLEвместо того, dCOMPLEXпотому что последний выводит 1 символ в строке.


5

Поскольку речь идет конкретно об альтернативных инструментах для получения данных из PDF в формате XML, вам может быть интересно взглянуть на коммерческий инструмент "ByteScout PDF Extractor SDK" который способен именно на это: извлекать текст из PDF в формате XML вместе с данные позиционирования (x, y) и информация о шрифте:

Текст в исходном PDF:

Products | Units | Price 

Выходной XML:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: дополнительно он также разбивает текст на структуру таблицы.

Раскрытие информации: я работаю на ByteScout


3

Лучшее, что я могу сейчас себе представить (из списка «простых» инструментов) - это Ghostscript (текущая версия v.8.71) и служебная программа PostScript ps2ascii.ps. Ghostscript отправляет его в своем libподкаталоге. Попробуйте это (в Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

Эта команда обрабатывает страницы 3-7 из input.pdf. Прочитайте комментарии в самом ps2ascii.psфайле, чтобы увидеть, что означают «странные» цифры и дополнительная информация ( они указывают строки, позиции, ширину, цвета, картинки, прямоугольники, шрифты и разрывы страниц ... ). Чтобы получить «простой» вывод текста, замените -dCOMPLEXдеталь на -dSIMPLE.


2
Как вы могли догадаться, это только вывод теста ASCII. Хотя это бесплатное приложение, это не лучший вариант для программного обеспечения, для которого вы планируете использовать языки, отличные от английского.
userx

3
@userx: Как вы могли догадаться, это бесплатное программное обеспечение: поэтому доступен исходный код. Возможно продление поддержки non-ASCII ...
Курт Пфайфл

@userx: сегодня я обнаружил «TET», набор инструментов для извлечения текста из pdflib.com. Смотрите мой другой ответ.
Курт Пфайфл

ps2ascii из Ghostscript 9.07 прекрасно работал на моей системе OpenBSD. Я только что преобразовал 526-страничный PDF в обычный текст. Теперь я могу легко grep и извлекать текст для заметок. Я использовал простую команду ps2ascii book.pdf notes.txt. Если ваш документ преимущественно ASCII, вам повезло.
Клинт Пахл

3

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

https://gist.github.com/smalot/6183152

В некоторых случаях командная строка запрещена по соображениям безопасности. Таким образом, нативный класс PHP может удовлетворить многие потребности.

Надеюсь, это поможет





0

В моих системах Macintosh я обнаружил, что «Adobe Reader» делает довольно хорошую работу. Я создал псевдоним на рабочем столе, который указывает на «Adobe Reader.app», и все, что я делаю, - это перетаскиваю pdf-файл на псевдоним, который делает его активным документом в Adobe Reader, а затем из меню «Файл», Я выбираю «Сохранить как текст ...», даю ему имя и место для сохранения, нажимаю «Сохранить», и все готово.


5
ОП искал решение для извлечения текста из PDF программно . Ваш ответ предлагает ручную процедуру вместо этого.
Мкл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.