поиск текста в pdf с использованием python?

<p><strong>проблема</strong><br> я пытаюсь определить, к какому типу относится документ (например, просьба, корреспонденция, повестка в суд и т.д.), просматривая его текст, предпочтительно используя python. все pdf-файлы доступны для поиска, но я не нашел решения для его анализа с помощью python и применения сценария для его поиска (если сначала не преобразовать его в текстовый файл, но это может потребовать значительных ресурсов). русские документы).</p><p><strong>что я сделал до сих пор</strong><br> я изучил pypdf, pdfminer, документацию adobe pdf и любые вопросы, которые я мог найти здесь (хотя, похоже, ни один из них напрямую не решал эту проблему). pdfminer, кажется, обладает наибольшим потенциалом, но после прочтения документации я даже не знаю, с чего начать.</p><p>существует ли простой эффективный способ чтения текста pdf по странице, по строке или по всему документу? или любые другие обходные пути?</p>

<p>это называется pdf майнингом, и это очень сложно, потому что:</p><ul> <li>pdf - это формат документа, предназначенный для печати, а не для анализа. внутри документа pdf текст не имеет определенного порядка (если порядок не важен для печати), большую часть времени исходная структура текста теряется (буквы не могут быть сгруппированы, так как слова и слова не могут быть сгруппированы в предложениях, и порядок их размещения в статье часто бывает случайным).</li> <li>существует множество программ для создания pdf-файлов, многие из них неисправны.</li> </ul><p>такие инструменты, как pdfminer, используют эвристику для повторной группировки букв и слов в зависимости от их положения на странице. я согласен, интерфейс довольно низкого уровня, но он имеет больше смысла, когда вы знаете, какую проблему они пытаются решить (в конце концов, важно выбрать, как близко от соседей должна быть буква/слово/строка считаться частью абзаца).</p><p>дорогая альтернатива (с точки зрения времени/мощности компьютера) - генерирование изображений для каждой страницы и подача их в ocr, возможно, стоит попробовать, если у вас очень хорошее ocr.</p><p>таким образом, мой ответ - нет, такого понятия, как простой и эффективный метод извлечения текста из pdf файлов, не существует - если ваши документы имеют известную структуру, вы можете точно настроить правила и получить хорошие результаты, но это всегда азартная игра.</p><p>я бы очень хотел оказаться неправым.</p><p>[обновление]</p><p>ответ не изменился, но недавно я участвовал в двух проектах: один из них использует компьютерное зрение для извлечения данных из отсканированных больничных форм. другой извлекает данные из судебных протоколов. то, что я узнал, это:</p><ol> <li> <p>в 2018 году компьютерное зрение станет доступным для простых смертных. если у вас есть хороший образец уже классифицированных документов, вы можете использовать opencv или scikit-image, чтобы извлечь функции и обучить классификатор машинного обучения, чтобы определить, какой тип документа.</p> </li> <li> <p>если анализируемый pdf "доступен для поиска", вы можете очень далеко извлечь весь текст, используя программное обеспечение, такое как <a href="https://linux.die.net/man/1/pdftotext">pdftotext</a> , и байесовский фильтр (такой же алгоритм, используемый для классификации спам).</p> </li> </ol><p>таким образом, не существует надежного и эффективного метода извлечения текста из pdf файлов, но он может вам не понадобиться для решения рассматриваемой проблемы (классификация типов документов).</p>

<p>я написал обширные системы для компании, в которой я работаю, для преобразования pdf в данные для обработки (счета, расчеты, отсканированные билеты и т.д.), и @paulo scardine верен - не существует абсолютно надежного и простого способа сделать это , тем не менее, самый быстрый, самый надежный и наименее интенсивный способ - это использовать <code>pdftotext</code>, часть набора <a href="http://www.foolabs.com/xpdf/home.html">xpdf</a> инструментов. этот инструмент быстро преобразует pdf с возможностью поиска в текстовый файл, который вы можете прочитать и проанализировать с помощью python. подсказка: используйте аргумент <code>-layout</code>. и, кстати, не все pdf-файлы доступны для поиска, только те, которые содержат текст. некоторые pdf-файлы содержат только изображения без текста.</p>

<p>я полностью зеленая рука, но у меня как-то работает этот скрипт:</p><pre><code># import packages import pypdf2 import re # open the pdf file object = pypdf2.pdffilereader("test.pdf") # get number of pages numpages = object.getnumpages() # define keyterms string = "social" # extract text and do the search for i in range(0, numpages): pageobj = object.getpage(i) print("this is page " + str(i)) text = pageobj.extracttext() # print(text) ressearch = re.search(string, text) print(ressearch) </code></pre>

<p>я недавно начал использовать scraperwiki, чтобы делать то, что вы описали.</p><p>вот пример <a href="http://schoolofdata.org/2013/08/16/scraping-pdfs-with-python-and-the-scraperwiki-module/">пример</a> использования scraperwiki для извлечения pdf данных.</p><p>функция <code>scraperwiki.pdftoxml()</code> возвращает структуру xml.</p><p>затем вы можете использовать beautifulsoup, чтобы разобрать это в навигационное дерево.</p><p>вот мой код для -</p><pre><code>import scraperwiki, urllib2 from bs4 import beautifulsoup def send\_request(url): #get content, regardless of whether an html, xml or pdf file pagecontent = urllib2.urlopen(url) return pagecontent def process\_pdf(filelocation): #use this to get pdf, covert to xml pdftoprocess = send\_request(filelocation) pdftoobject = scraperwiki.pdftoxml(pdftoprocess.read()) return pdftoobject def parse\_html\_tree(contenttoparse): #returns a navigatibale tree, which you can iterate through soup = beautifulsoup(contenttoparse) return soup pdf = process\_pdf('http://greenteapress.com/thinkstats/thinkstats.pdf') pdftosoup = parse\_html\_tree(pdf) souptoarray = pdftosoup.findall('text') for line in souptoarray: print line </code></pre><p>этот код собирается напечатать целую большую уродливую кучу тегов <code><text></code>. каждая страница отделена <code></page></code>, если это утешением.</p><p>если вам нужно содержимое внутри тегов <code><text></code>, которое может включать заголовки, например, заключенные в <code><b></code>, используйте <code>line.contents</code></p><p>если вам нужна только каждая строка текста, не включая теги, используйте <code>line.gettext()</code></p><p>это грязно и мучительно, но это будет работать для документов с возможностью поиска pdf. до сих пор я находил это точным, но болезненным.</p>

<p>я согласен с @paulo pdf добыча данных - огромная боль. но вы можете добиться успеха с <code>pdftotext</code>, который является частью свободно доступного здесь набора xpdf:</p><p> <a href="http://www.foolabs.com/xpdf/download.html">http://www.foolabs.com/xpdf/download.html</a> </p><p>это должно быть достаточно для вашей цели, если вы просто ищете отдельные ключевые слова.</p><p><code>pdftotext</code> - это утилита командной строки, но она очень проста в использовании. это даст вам текстовые файлы, с которыми вам может быть проще работать.</p>

<p>вот решение, которое мне показалось удобным для этой проблемы. в текстовой переменной вы получаете текст из pdf для поиска в нем. но я сохранил также идею разбивать текст на ключевые слова, как нашел на этом сайте: <a href="https://medium.com/@rqaiserr/how-to-convert-pdfs-into-searchable-key-words-with-python-85aab86c544f">https://medium.com/@rqaiserr/how-to-convert-pdfs-into-searchable-key-words -with-python-85aab86c544f</a> откуда я взял это решение, хотя создание nltk было не очень простым, оно может пригодиться для дальнейших целей:</p><pre><code>import pypdf2 import textract from nltk.tokenize import word\_tokenize from nltk.corpus import stopwords def searchinpdf(filename, key): occurrences = 0 pdffileobj = open(filename,'rb') pdfreader = pypdf2.pdffilereader(pdffileobj) num\_pages = pdfreader.numpages count = 0 text = "" while count < num\_pages: pageobj = pdfreader.getpage(count) count +=1 text += pageobj.extracttext() if text != "": text = text else: text = textract.process(filename, method='tesseract', language='eng') tokens = word\_tokenize(text) punctuation = ['(',')',';',':','[',']',','] stop\_words = stopwords.words('english') keywords = [word for word in tokens if not word in stop\_words and not word in punctuation] for k in keywords: if key == k: occurrences+=1 return occurrences pdf\_filename = '/home/florin/downloads/python.pdf' search\_for = 'string' print searchinpdf (pdf\_filename,search\_for) </code></pre>