Читать pdf страницу за страницей

Я искал свой вопрос и не получил ответа на два доступных вопроса

  1. Извлечь текст на странице с помощью Python pdfMiner?

  2. PDFMiner — перебор страниц и преобразование их в текст

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

Я использовал pyPdf. Он работает почти, я могу сказать, на 90% pdfs, но иногда он не извлекает информацию со страницы.

Я использовал следующий код:

import pyPdf
extract = ""        
pdf = pyPdf.PdfFileReader(open('filename.pdf', "rb"))
num_of_pages = pdf.getNumPages()
for p in range(num_of_pages):
  ex = pdf.getPage(6)
  ex = ex.extractText()
  if re.search(r"to be held (at|on)",ex.lower()):
    print 'yes'
    print  ex ,"\n"
    extract = extract + ex + "\n" 
    continue

Приведенный выше код работает, но иногда некоторые страницы не извлекаются.

Я также пытался использовать pdfminer, но я не мог найти, как перебирать в нем pdf страницу за страницей. pdfminer возвращает весь текст PDF.

Я использовал следующий код:

def convert_pdf_to_txt(path):
  rsrcmgr = PDFResourceManager()
  retstr = StringIO()
  codec = 'utf-8'
  laparams = LAParams()
  device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
  fp = file(path, 'rb')
  interpreter = PDFPageInterpreter(rsrcmgr, device)
  password = ""
  maxpages = 0
  caching = True
  pagenos=set()

 for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
    interpreter.process_page(page)

    text = retstr.getvalue()

   fp.close()
   device.close()
   retstr.close()
   return text

В приведенном выше коде текст из pdf исходит из цикла for

for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
    interpreter.process_page(page)

    text = retstr.getvalue()

В этом, как я могу повторять по одной странице за раз.

Документация по pdfminer непонятна. Также существует множество версий одного и того же.

Итак, есть ли какие-либо другие пакеты, доступные для моего вопроса, или для него можно использовать pdfminer?


person Rohan Amrute    schedule 04.01.2016    source источник


Ответы (3)


Поскольку retstr будет сохранять каждую страницу, вы можете изменить свой код, вызвав retstr.truncate(0), который каждый раз очищает строку, в противном случае вы каждый раз печатаете все, что уже было прочитано:

import pyPdf
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO

path = "filename.pdf"
pdf = pyPdf.PdfFileReader(open(path, "rb"))
fp = file(path, 'rb')
num_of_pages = pdf.getNumPages()
extract = ""
for i in range(num_of_pages):
  inside = [i]
  pagenos=set(inside)
  rsrcmgr = PDFResourceManager()
  retstr = StringIO()
  codec = 'utf-8'
  laparams = LAParams()
  device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
  interpreter = PDFPageInterpreter(rsrcmgr, device)
  password = ""
  maxpages = 0
  caching = True
  text = ""
  for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
    interpreter.process_page(page)
    text = retstr.getvalue()
    retstr.truncate(0)
    text = text.decode("ascii","replace")
    if re.search(r"to be held (at|on)",text.lower()):
        print text
        extract = extract + text + "\n" 
        continue
person fiftyseventheory    schedule 24.11.2018
comment
ОМГ мужик! усеченная линия спасла мне жизнь! Я собирался сдаться и нашел ваш фрагмент кода после долгих исследований. 2 часа ночи и я наконец-то высплюсь. Благодарность - person rodrigorf; 24.08.2019

Я знаю, что нехорошо отвечать на свой вопрос, но я думаю, что, возможно, нашел ответ на этот вопрос.

Я думаю, что это не лучший способ сделать это, но все же это помогает мне.

Я использовал комбинацию pypdf и pdfminer

Код выглядит следующим образом:

import pyPdf
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO

path = "filename.pdf"
pdf = pyPdf.PdfFileReader(open(path, "rb"))
fp = file(path, 'rb')
num_of_pages = pdf.getNumPages()
extract = ""
for i in range(num_of_pages):
  inside = [i]
  pagenos=set(inside)
  rsrcmgr = PDFResourceManager()
  retstr = StringIO()
  codec = 'utf-8'
  laparams = LAParams()
  device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
  interpreter = PDFPageInterpreter(rsrcmgr, device)
  password = ""
  maxpages = 0
  caching = True
  text = ""
  for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
    interpreter.process_page(page)
    text = retstr.getvalue()
    text = text.decode("ascii","replace")
    if re.search(r"to be held (at|on)",text.lower()):
        print text
        extract = extract + text + "\n" 
        continue

Там может быть лучший способ сделать это, но в настоящее время я обнаружил, что это довольно хорошо.

person Rohan Amrute    schedule 06.01.2016
comment
Нет ничего плохого в том, чтобы ответить на свой вопрос. В конце концов, это может быть полезно другим. - person Brecht Machiels; 06.02.2016
comment
Получение ошибки ModuleNotFoundError: No module named 'pdf'. - person Piyush S. Wanare; 24.07.2018
comment
@PiyushS.Wanare использует PyPDF2 вместо pyPDF. Для справки: pip install PyPDF2, затем from PyPDF2 import PdfFileReader - person Ishank Saxena; 17.04.2021

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

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages("test.pdf"):
    for element in page_layout:
        if isinstance(element, LTTextContainer):
            print(element.get_text())

Постраничное извлечение текста PDFMiner

person Nisarg Sheth    schedule 24.11.2020