【问题标题】:How to use PDFminer.six with python 3?如何在 python 3 中使用 PDFminer.six?
【发布时间】:2019-10-22 22:42:45
【问题描述】:

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

我已经尝试过 StackOverflow 中的一些代码,但没有成功。下面是我的代码。

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 中获取数据的代码示例。

【问题讨论】:

    标签: python-3.x pypdf2 pdfminer


    【解决方案1】:

    安装 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)
    

    【讨论】:

    • 我想要更多关于这个问题的建议。考虑到我有带有表格和一些文本的 PDF 文件。比如一段或一些细节,然后是一些描述一些细节的表格。最好的例子是所得税申报表或银行对账单。现在如果我使用 PDFminer 是否有可能以有意义的方式获取数据?比如那一年或 ITR 是多少,有人支付了多少 ITR 等?
    • 由于converter's laparams 参数未指定的文本可以不带空格提取。如果有人会以这种方式搜索答案,请创建问题并回答 (stackoverflow.com/questions/58889337/…)
    • 如何在上述代码中每页后添加分页符?
    • 有没有办法将文本转换成小数或整数数组???
    • @Urvish 使用 tabula-py
    【解决方案2】:

    完全披露,我是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。我会尽量让它们保持同步。

    【讨论】:

    • 当我尝试将其打印到控制台时,我从 extract_text() 方法得到“无”作为响应,每页一个。为什么会发生这种情况?我尝试了 2 种不同的 PDF,它们都是来自不同来源的学术研究。
    • 好的,我想通了:我使用了 Firefox 中的打印功能来另存为 PDF,而不是直接下载它。这样做会使整个页面只是一个图像,而不是字形的集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2017-10-19
    • 2014-04-24
    • 2013-04-17
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多