逐页阅读pdf

时间:2016-01-04 13:00:04

标签: python python-2.7 pdf pypdf pdfminer

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

  1. Extract text per page with Python pdfMiner?

  2. PDFMiner - Iterating through pages and converting them to text

  3. 基本上我想迭代每个页面,因为我只想选择那个某个文字的页面。

    我使用过pyPdf。它适用于几乎我可以说pdfs的90%,但有时它不会从页面中提取信息。

    我使用了以下代码:

    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可以用它吗?

3 个答案:

答案 0 :(得分:3)

我知道回答你自己的问题并不好,但我想我可能已经找到了这个问题的答案。

我认为这不是最好的方法,但它仍然有助于我。

我使用了var flatten = require('gulp-flatten'); gulp.task('copyCss', function () { gulp.src('/bower_components/**/*.css') .pipe(flatten()) .pipe(gulp.dest('/content/css')); }); pypdf

的组合

代码如下:

pdfminer

可能有更好的方法,但目前我发现这是非常好的。

答案 1 :(得分:1)

因为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

答案 2 :(得分:0)

您可以引用以下链接从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 Page by Page text Extraction