如何使用 PDFminer.six 和 python 3?

How to use PDFminer.six with python 3?

我想使用 pdfminer.six,这是一个可以与 Python3 一起使用的工具,用于从 PDF 文档中提取信息。问题是根本没有好的文档,也没有关于如何使用该工具的源代码示例。

我已经尝试了一些来自 Whosebug 的代码,但没有成功。下面是我的代码。

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(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 获取数据的代码示例。

安装pdfminer.six或pdfminer3 (https://github.com/gwk/pdfminer3/) 安装:pip install pdfminer3 当我从 3.6 升级到 3.7 时,我切换到 pdfminer3 我在 ubuntu 和 macos 上使用 python 3.7.3

pdfminer3 附带两个方便的工具:pdf2txt.py 和 dumppdf.py 检查来源。相当小且易于理解。

以下是一个工作示例(一旦添加了 pdf 文件的位置)

from pdfminer3.layout import LAParams, LTTextBox
from pdfminer3.pdfpage import PDFPage
from pdfminer3.pdfinterp import PDFResourceManager
from pdfminer3.pdfinterp import PDFPageInterpreter
from pdfminer3.converter import PDFPageAggregator
from pdfminer3.converter import TextConverter
import io

resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager, fake_file_handle, laparams=LAParams())
page_interpreter = PDFPageInterpreter(resource_manager, converter)

with open('/path/to/file.pdf', 'rb') as fh:

    for page in PDFPage.get_pages(fh,
                                  caching=True,
                                  check_extractable=True):
        page_interpreter.process_page(page)

    text = fake_file_handle.getvalue()

# close open handles
converter.close()
fake_file_handle.close()

print(text)

完全公开,我是 pdfminer.six 的维护者之一。它是 python 3.

的 pdfminer 社区维护版本

如今,它有多个 api 可以根据您的需要从 PDF 中提取文本。在幕后,所有这些 api 使用相同的逻辑来解析和分析布局。

(所有示例均假设您的 PDF 文件名为 example.pdf

命令行

如果您只想提取文本一次,可以使用命令行工具 pdf2txt.py:

$ pdf2txt.py example.pdf

高级api

如果你想用Python提取文本(属性),你可以使用高级api。如果您想以编程方式从 PDF 中提取信息,则此方法是首选解决方案。

from pdfminer.high_level import extract_text

# Extract text from a pdf.
text = extract_text('example.pdf')

# Extract iterable of LTPage objects.
pages = extract_pages('example.pdf')

可组合api

还有一个可组合的 api 可以在处理生成的对象时提供很大的灵活性。例如,它允许您创建自己的布局算法。这个方法在其他答案中有推荐,但我只在你需要自定义一些组件时才推荐这个方法。

from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()
with open('example.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

print(output_string.getvalue())

类似的问题和答案here。我会尽量让它们保持同步。