Как извлечь текст из PDF?

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

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

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


person Budda007    schedule 06.09.2010    source источник
comment
Связанный вопрос: Извлечь изображения и слова с координатами и размерами из PDF   -  person yms    schedule 02.05.2013
comment
Для тех, кому нужно что-то действительно простое (без информации о позиции), этого регулярного выражения perl может быть достаточно: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Он просто ищет оператор Tj/TJ, который обозначает весь обычный текст в PDF.   -  person Alex R    schedule 25.10.2015
comment
используйте библиотеку TomRoush PdfBox, это хорошо работает на Android   -  person FaisalAhmed    schedule 17.03.2017


Ответы (15)


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

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

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

person user2176753    schedule 16.10.2014
comment
В linux и cygwin команда gs вместо gswin64c . Работает отлично. Никакого запатентованного платного дерьма. Это просто работает. - person Jannes; 15.06.2015
comment
Ага, отлично работает! Теперь я могу безнаказанно использовать grep в своих pdf-файлах. Поскольку я могу найти лучше, чем читать, это победа! (:-) Голосую за. - person David Elson; 09.08.2015
comment
Единственная проблема, с которой я столкнулся, заключалась в том, что я использовал ее в pdf-файлах со встроенными «старыми» шрифтами. Отлично работает для локально сгенерированных PDF-файлов, но сложнее с неясными источниками. В остальном отличный скриптлет. - person Jon M; 23.12.2017
comment
что делает -sDEVICE=txtwrite? Я мало что понял после прочтения Как Используйте призрачный скрипт | Выбор устройства вывода - person Ooker; 06.04.2020
comment
Для вывода на стандартный вывод вместо сохранения в виде текстового файла используйте gswin64c -sDEVICE=txtwrite -o- input.pdf. Источник (слегка изменен мной): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac - person LuH; 15.06.2020

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

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

person 131    schedule 13.08.2014
comment
На заметку: используйте переключатель -layout для сохранения таблиц, работает очень хорошо. - person sebastian; 08.02.2016

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

PDFlib.com — компания Томаса Мерца. Если вы не знаете его имени: Томас Мерц является автором «Библии в формате PostScript и PDF».

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

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

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

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

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

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

Попробуйте.

person Kurt Pfeifle    schedule 15.09.2010
comment
Пробной версии нет, а 440 долларов — это слишком много, чтобы попробовать. - person Rok Strniša; 13.09.2013
comment
я проверил это, он не распознает столбцы. Я просмотрел первую полосу английского таблоида. На бумаге текст был разделен на 3 столбца, но этот плагин полностью перепутал предложения, из-за чего это выглядело тарабарщиной. Бесплатный Ghostscript имел точно такой же вывод. - person NoWhereToBeSeen; 04.08.2017
comment
@RedHotScalability: Кстати, вам может повезти больше с разделом этого ответа, pdftotext. Но я настаиваю, чтобы вы добавили параметр -layout... - person Kurt Pfeifle; 04.08.2017
comment
@RedHotScalability: Кстати, TET действительно распознает столбцы, если они используются с правильными параметрами. Но я оставляю в качестве упражнения амбициозному JS-сценаристу чтение документации и выяснение того, как... - person Kurt Pfeifle; 04.08.2017
comment
Спасибо @Курт. Мой текущий вариант использования — это способность распознавать текстовые области, такие как подтверждения, ссылки и т. д. Есть ли у вас какие-либо советы о том, как это сделать? - person lucid_dreamer; 25.08.2017
comment
Только что сравнил результаты TET, Xpdf, pdftotext и Ghostscript. Файл PDF имел латиницу и кириллицу и многоколоночную компоновку. Xpdf pdftotext был лучшим, потом Ghostscript, а худшим был TET. - person zoran; 13.03.2019
comment
@Kurt Pfeifle xpdf-tools-win-4.01, Ghostscript 9.26, TET 5.1. В итоге использовал Apache Tika 1.20 - person zoran; 16.03.2019

Для Python есть PDFMiner и pyPDF2. Для получения дополнительной информации см. модуль Python для преобразования PDF в текст. .

person Jonathan    schedule 09.03.2013

Вот мое предложение. Если вы хотите извлечь текст из PDF, вы можете импортировать файл PDF в Документы Google, а затем экспортировать его в более удобный формат, такой как .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 и другие.

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

person oabarca    schedule 10.12.2013
comment
Я использовал этот вариант, и я бы не рекомендовал его. Извлечение текста в формате PDF Google не так хорошо, как многие альтернативы (особенно для неанглоязычных), а также очень-очень медленно. - person Björn Lindqvist; 19.05.2014

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

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

person Renaud    schedule 16.09.2012
comment
PdfTextStream не поддерживается в Android. Есть ли такие хорошие библиотеки для Android? - person FaisalAhmed; 03.03.2017
comment
@FaisalAhmed как насчет PDFBox? - person Renaud; 05.03.2017
comment
Да, PdfBox также не поддерживается в Android .... и PdfTextStream, и PdfBox используют некоторую часть awt, которая не поддерживается в Android. - person FaisalAhmed; 06.03.2017
comment
я использую эту библиотеку, которая хорошо работает на Android github.com/TomRoush/PdfBox-Android - person FaisalAhmed; 17.03.2017

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

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

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

person kvz    schedule 25.02.2014

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

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

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

person Bobrovsky    schedule 15.04.2011

Поскольку вопрос конкретно касается альтернативных инструментов для получения данных из 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>

P.S.: кроме того, он также разбивает текст на табличную структуру.

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

person Eugene    schedule 10.02.2015

Лучшее, что я могу сейчас придумать (в списке «простых» инструментов), это 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.

person Kurt Pfeifle    schedule 07.09.2010
comment
Как вы могли догадаться, это выводит только тест ASCII. Хотя это бесплатно, это не лучший вариант для программного обеспечения, которое вы планируете использовать на других языках, кроме английского. - person userx; 09.09.2010
comment
@userx: Как вы могли догадаться, это бесплатное программное обеспечение: поэтому доступен исходный код. Возможно расширение для поддержки не-ASCII... - person Kurt Pfeifle; 10.09.2010
comment
@userx: сегодня я обнаружил TET, набор инструментов для извлечения текста с pdflib.com. Смотрите мой другой ответ. - person Kurt Pfeifle; 16.09.2010
comment
ps2ascii из Ghostscript 9.07 прекрасно работал в моей системе OpenBSD. Я только что преобразовал 526-страничный PDF-файл в обычный текст. Теперь я могу легко найти и извлечь текст для заметок. Я использовал простую команду ps2ascii book.pdf notes.txt. Если ваш документ преимущественно ASCII, вам повезло. - person Clint Pachl; 18.04.2020

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

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

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

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

person Sebastien Malot    schedule 08.08.2013

Для извлечения изображений pdfimages — это бесплатный инструмент командной строки для Linux или Windows (win32):

pdfimages: извлечение и сохранение изображений из переносимого формата документа ( PDF ) Файл

person Sun    schedule 18.02.2013

Apache pdfbox имеет эту функцию - текстовая часть описана в:

http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/PDFTextStripper.html

пример реализации см. на странице https://github.com/WolfgangFahl/pdfindexer.

тестовый пример TestPdfIndexer.testExtracting показывает, как это работает

person Wolfgang Fahl    schedule 07.03.2014

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

http://www.quickpdflibrary.com/ — у них есть 30-дневная пробная версия.

person Andrew Cash    schedule 07.09.2010

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

person Dick Guertin    schedule 12.01.2015
comment
ОП искал решение для извлечения текста из PDF-файла программно. В вашем ответе вместо этого предлагается ручная процедура. - person mkl; 12.01.2015