逐页阅读pdf

Roh*_*ute 1 python pdf pypdf python-2.7 pdfminer

我搜索了我的问题,但在两个可用问题中没有得到我的答案

  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
Run Code Online (Sandbox Code Playgroud)

上面的代码有效,但有时无法提取某些页面。

我也尝试使用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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,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()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我如何一次迭代一页。

上的文档pdfminer无法理解。同样的版本也有很多。

那么是否有任何其他软件包可用于我的问题或可以pdfminer用于它?

小智 5

因为 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
Run Code Online (Sandbox Code Playgroud)