Python使用pdfminer库玩转PDF文本提取

 更新时间:2025年02月05日 08:45:50   作者:正东AI  
pdfminer是一个开源的Python第三方库,专门用于解析PDF文件,本文主要为大家详细介绍了如何使用pdfminer实现PDF文本提取,有需要的小伙伴可以了解下

一、背景

在日常工作中,我们常常需要处理PDF文件,比如提取文本内容、分析文档结构等。然而,PDF文件的格式复杂,直接提取信息并非易事。pdfminer库应运而生,它能够高效地解析PDF文件,提取文本、元数据、表格等信息,帮助我们轻松应对各种PDF处理需求。接下来,让我们深入了解这个强大的工具。

二、什么是pdfminer

pdfminer是一个开源的Python第三方库,专门用于解析PDF文件。它提供了丰富的API,可以精确提取文本、分析页面布局、提取元数据等。它的核心功能是将PDF文件的内容转换为可操作的文本数据,方便进一步处理和分析。

三、如何安装pdfminer

pdfminer是一个第三方库,可以通过以下命令行安装:

pip install pdfminer.six

安装完成后,可以通过以下命令确认安装是否成功:

python -c "import pdfminer; print(pdfminer.__version__)"

如果能够正常输出版本号,说明安装成功。

四、简单库函数使用方法

以下是pdfminer中常用的五个函数及其使用方法:

1. 提取文本

from pdfminer.high_level import extract_text

text = extract_text("example.pdf")
print(text)

extract_text函数用于从PDF文件中提取全部文本。

2. 获取页面布局信息

from pdfminer.layout import LAParams, LTTextBox, LTTextLine
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator

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

​​​​​​​with open("example.pdf", "rb") as pdf_file:
    for page in PDFPage.get_pages(pdf_file):
        page_interpreter.process_page(page)
        layout = converter.get_result()
        for lt_obj in layout:
            if isinstance(lt_obj, (LTTextBox, LTTextLine)):
                text = lt_obj.get_text()
                x, y, width, height = lt_obj.bbox
                font = lt_obj._objs[0].fontname
                font_size = lt_obj._objs[0].size
                print(f"Text: {text.strip()}, Position: ({x:.2f}, {y:.2f}), Font: {font}, Size: {font_size:.2f}")

这段代码获取文本块的位置、字体和字号等信息。

3. 提取表格数据

from pdfminer.high_level import extract_text
import tabula

table_text = extract_text("table_example.pdf")
print(table_text)

tables = tabula.read_pdf("table_example.pdf", pages="all")
for df in tables:
    print(df)

使用pdfminer提取PDF文档中的表格,并使用tabula提取表格数据。

4. 提取图像

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import PDFStream
import io
from PIL import Image

​​​​​​​with open('example.pdf', 'rb') as file:
    parser = PDFParser(file)
    document = PDFDocument(parser)
    if document.is_extractable:
        for xref in document.xrefs:
            if xref.get_subtype() == '/Image':
                stream_obj = xref.get_object()
                if isinstance(stream_obj, PDFStream):
                    data = stream_obj.get_rawdata()
                    image = Image.open(io.BytesIO(data))
                    image.show()

提取PDF文档中的图像。

5. 提取元数据

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument

def extract_metadata(pdf_path):
    with open(pdf_path, 'rb') as fh:
        parser = PDFParser(fh)
        doc = PDFDocument(parser)
        metadata = doc.info[0]
        for key, value in metadata.items():
            print(f"{key}: {value}")

extract_metadata('example.pdf')

提取PDF文件的元数据。

五、实际应用场景

以下是pdfminer在不同场景中的应用示例:

1. 法律文档处理

from pdfminer.high_level import extract_text

def extract_legal_document_text(pdf_path):
    text = extract_text(pdf_path)
    return text

text = extract_legal_document_text('legal_document.pdf')
print(text)

在法律行业,通过pdfminer提取和分析法律文档中的文本和元数据,自动生成报告。

2. 财务报表分析

from pdfminer.layout import LAParams, LTTextBoxHorizontal
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator

def extract_financial_tables(pdf_path):
    with open(pdf_path, 'rb') as fh:
        rsrcmgr = PDFResourceManager()
        laparams = LAParams()
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        interpreter = PDFPageInterpreter(rsrcmgr, device)

        for page in PDFPage.get_pages(fh, caching=True, check_extractable=True):
            interpreter.process_page(page)
            layout = device.get_result()
            for element in layout:
                if isinstance(element, LTTextBoxHorizontal):
                    print(element.get_text())

​​​​​​​extract_financial_tables('financial_report.pdf')

在财务行业,通过pdfminer提取财务报表中的表格数据,进行自动化的数据分析和处理。

3. 研究论文数据提取

from pdfminer.layout import LAParams, LTTextBoxHorizontal, LTFigure
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator

def extract_research_paper_content(pdf_path):
    with open(pdf_path, 'rb') as fh:
        rsrcmgr = PDFResourceManager()
        laparams = LAParams()
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        interpreter = PDFPageInterpreter(rsrcmgr, device)

        for page in PDFPage.get_pages(fh, caching=True, check_extractable=True):
            interpreter.process_page(page)
            layout = device.get_result()
            for element in layout:
                if isinstance(element, LTTextBoxHorizontal):
                    print(element.get_text())
                elif isinstance(element, LTFigure):
                    print("Figure found")

​​​​​​​extract_research_paper_content('research_paper.pdf')

在学术研究中,通过pdfminer提取研究论文中的文本和图表信息,辅助研究分析。

4. 文本逐页提取

from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from io import StringIO

def extract_text_by_page(pdf_path):
    resource_manager = PDFResourceManager()
    fake_file_handle = StringIO()
    converter = TextConverter(resource_manager, fake_file_handle)
    page_interpreter = PDFPageInterpreter(resource_manager, converter)

    with open(pdf_path, '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()
            yield text

    converter.close()
    fake_file_handle.close()

​​​​​​​for page_text in extract_text_by_page('example.pdf'):
    print(page_text)

逐页提取PDF文件中的文本,适用于需要逐页处理的情况。

5. 提取目录

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument, PDFNoOutlines

def extract_toc(pdf_path):
    with open(pdf_path, 'rb') as file:
        parser = PDFParser(file)
        document = PDFDocument(parser)
        try:
            outlines = document.get_outlines()
            toc = []
            for (level, title, dest, a, se) in outlines:
                toc.append((level, title))
            return toc
        except PDFNoOutlines:
            return []

​​​​​​​toc = extract_toc('example.pdf')
for item in toc:
    print(f"Level: {item[0]}, Title: {item[1]}")

提取PDF文档的目录,方便快速定位文档结构。

六、常见问题及解决方案

以下是使用pdfminer时常见的问题及解决方案:

文本提取为空

错误信息 :extract_text返回空字符串。

原因 :PDF文件可能包含非文本内容,或者文本被嵌入为图像。

解决方案 :检查PDF文件的内容,确保文本是可提取的。如果文本嵌入为图像,可以尝试使用OCR工具(如`pytesseract

以上就是Python使用pdfminer库玩转PDF文本提取的详细内容,更多关于Python pdfminer PDF文本提取的资料请关注脚本之家其它相关文章!

相关文章

  • python基础之字典

    python基础之字典

    这篇文章主要介绍了python的字典,实例分析了Python中返回一个返回值与多个返回值的方法,需要的朋友可以参考下
    2021-10-10
  • Python3爬虫关于识别点触点选验证码的实例讲解

    Python3爬虫关于识别点触点选验证码的实例讲解

    在本篇文章里小编给大家整理了关于Python3爬虫关于识别点触点选验证码的实例讲解内容,需要的朋友们可以参考下。
    2020-07-07
  • Python设计模式之迭代器模式原理与用法实例分析

    Python设计模式之迭代器模式原理与用法实例分析

    这篇文章主要介绍了Python设计模式之迭代器模式原理与用法,结合具体实例形式分析了迭代器模式的概念、原理、定义及使用方法,代码注释说明简单易懂,需要的朋友可以参考下
    2019-01-01
  • Pycharm连接远程服务器过程图解

    Pycharm连接远程服务器过程图解

    这篇文章主要介绍了Pycharm连接远程服务器过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • mat矩阵和npy矩阵实现互相转换(python和matlab)

    mat矩阵和npy矩阵实现互相转换(python和matlab)

    这篇文章主要介绍了mat矩阵和npy矩阵实现互相转换(python和matlab),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • pandas.DataFrame选取/排除特定行的方法

    pandas.DataFrame选取/排除特定行的方法

    今天小编就为大家分享一篇pandas.DataFrame选取/排除特定行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python 爬取英雄联盟皮肤图片

    python 爬取英雄联盟皮肤图片

    还记得那些年一起网吧开黑通宵的日子吗?《英雄联盟》绝对是大学时期的风靡游戏,即使毕业多年的大学同学相聚,难免不怀念一番当时一起玩《英雄联盟》的日子。今天就给大家分享一下英雄及皮肤图片的爬虫。
    2021-05-05
  • Python实现网络聊天室的示例代码(支持多人聊天与私聊)

    Python实现网络聊天室的示例代码(支持多人聊天与私聊)

    这篇文章主要介绍了Python实现网络聊天室的示例代码(支持多人聊天与私聊),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python实现嵌套列表平铺的两种方法

    python实现嵌套列表平铺的两种方法

    今天小编就为大家分享一篇python实现嵌套列表平铺的两种方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python OpenCV学习之特征点检测与匹配详解

    Python OpenCV学习之特征点检测与匹配详解

    提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度学习的领域中,特征代表着图像的信息,对于分类、检测任务都是至关重要的。这篇文章主要为大家详细介绍了OpenCV特征点检测与匹配,需要的可以参考一下
    2022-01-01

最新评论