当前位置: 代码网 > it编程>前端脚本>Python > Python利用Spire.PDF for Python库抽取PDF文档文本

Python利用Spire.PDF for Python库抽取PDF文档文本

2026年02月06日 Python 我要评论
在当今数字化的世界中,pdf(portable document format)无疑是最普遍的文档格式之一。无论是报告、合同、发票还是学术论文,pdf都承载着海量的信息。然而,当我们需要从这些pdf文

在当今数字化的世界中,pdf(portable document format)无疑是最普遍的文档格式之一。无论是报告、合同、发票还是学术论文,pdf都承载着海量的信息。然而,当我们需要从这些pdf文档中提取文本进行数据分析、自动化处理或信息检索时,手动复制粘贴无疑是一项繁琐且效率低下的任务。

幸运的是,python凭借其强大的生态系统和丰富的库,为我们提供了优雅的解决方案。本文将深入探讨如何利用spire.pdf for python库,高效、准确地从pdf文档中提取文本,从而解放您的双手,提升数据处理的自动化水平。

为什么选择python进行pdf文本提取?

python在数据处理和自动化领域享有盛誉,其优势在于:

  • 生态系统丰富: 拥有众多处理各种数据格式的库,包括强大的pdf处理工具。
  • 易学易用: 语法简洁清晰,上手快,即使是初学者也能快速编写脚本。
  • 自动化能力强: 可以轻松集成到自动化工作流中,实现批量处理。

相比于传统的手动提取,python脚本能够以极高的速度和一致性完成任务,尤其是在面对大量pdf文件时,其效率优势更为显著。

认识spire.pdf for python库

spire.pdf for python是一个功能强大且专业的python库,专为pdf文档的创建、编辑、转换和解析而设计。在文本提取方面,它展现出以下显著优势:

  • 高精度文本提取: 能够准确识别并提取pdf中的文本内容,包括复杂的布局和字体。
  • 支持多种pdf类型: 无论是原生pdf还是包含扫描图像的pdf(通过内置的ocr功能),它都能有效处理。
  • 灵活的api调用: 提供了直观且易于使用的api接口,方便开发者进行各种操作。
  • 处理复杂布局: 针对多列、表格、图文混排等复杂布局的pdf,也能较好地保持文本的逻辑顺序。
  • 多语言支持: 能够处理包含多种语言的文本。

安装指南

在开始之前,请确保您已经安装了spire.pdf for python。如果尚未安装,可以通过pip命令轻松完成:

pip install spire.pdf

基础文本提取:从pdf文档中获取文本

提取整个pdf文档的文本

最常见的需求是提取pdf文档中的所有文本。spire.pdf for python提供了简洁的方法来实现这一点。

from spire.pdf import *
from spire.pdf.common import *

def extract_full_text(pdf_path, output_txt_path):
    """
    从pdf文档中提取所有文本并保存到txt文件。
    """
    # 创建pdfdocument对象
    doc = pdfdocument()
    
    # 加载pdf文件
    doc.loadfromfile(pdf_path)
    
    # 用于存储所有页面的文本
    full_text = ""
    
    # 遍历pdf文档中的每一页
    for i in range(doc.pages.count):
        page = doc.pages.get_item(i)
        
        # 创建pdftextextractor对象
        text_extractor = pdftextextractor(page)
        
        # 提取当前页面的文本
        # pdftextextractoptions可以用于配置提取行为,这里使用默认设置
        page_text = text_extractor.extracttext(pdftextextractoptions())
        full_text += page_text + "\n" # 添加换行符以分隔页面内容
        
    # 将提取的文本保存到文件
    with open(output_txt_path, "w", encoding="utf-8") as f:
        f.write(full_text)
        
    # 关闭文档
    doc.close()
    print(f"文本已成功从 {pdf_path} 提取并保存到 {output_txt_path}")

# 示例用法
pdf_file = "sample.pdf" # 替换为您的pdf文件路径
output_file = "sample_full_text.txt"
# 假设您有一个名为sample.pdf的文件
# extract_full_text(pdf_file, output_file)

提取结果示例:

代码解释:

  1. pdfdocument():实例化一个pdf文档对象。
  2. doc.loadfromfile(pdf_path):加载指定的pdf文件。
  3. doc.pages.count:获取pdf文档的页数。
  4. doc.pages.get_item(i):通过索引获取特定页面。
  5. pdftextextractor(page):为当前页面创建一个文本提取器。
  6. text_extractor.extracttext(pdftextextractoptions()):执行文本提取操作。pdftextextractoptions()可以用来控制提取行为,例如是否提取隐藏文本、文本提取方式等。

提取特定页面的文本

有时,我们只需要从pdf文档的特定页面中提取信息。spire.pdf for python同样支持这一功能。

from spire.pdf import *
from spire.pdf.common import *

def extract_page_text(pdf_path, page_number, output_txt_path):
    """
    从pdf文档的指定页面提取文本并保存到txt文件。
    """
    if page_number < 1:
        print("页码必须大于或等于1。")
        return

    doc = pdfdocument()
    doc.loadfromfile(pdf_path)

    if page_number > doc.pages.count:
        print(f"页码 {page_number} 超出文档总页数 {doc.pages.count}。")
        doc.close()
        return

    # pdf页码是基于0的索引,所以需要减1
    page = doc.pages.get_item(page_number - 1) 
    
    text_extractor = pdftextextractor(page)
    page_text = text_extractor.extracttext(pdftextextractoptions())
    
    with open(output_txt_path, "w", encoding="utf-8") as f:
        f.write(page_text)
        
    doc.close()
    print(f"第 {page_number} 页的文本已成功从 {pdf_path} 提取并保存到 {output_txt_path}")

# 示例用法
extract_page_text(pdf_file, 2, "sample_page_2_text.txt") # 提取第2页文本

进阶应用:结构化与区域文本提取

除了全文和单页提取,spire.pdf for python还提供了更精细的控制,例如提取特定区域的文本,这对于从复杂文档中获取结构化数据尤为有用。

提取pdf特定区域的文本

在许多场景下,我们可能只关心页面上的某个特定区域(例如,发票上的总金额、报告中的摘要部分)。spire.pdf for python允许我们通过定义一个矩形区域来精确提取文本。

from spire.pdf import *
from spire.pdf.common import *


def extract_region_text(pdf_path, page_number, x, y, width, height, output_txt_path):
    """
    从pdf文档的指定页面的特定区域提取文本。
    坐标 (x, y) 为区域左上角,width 和 height 定义区域大小。
    """
    doc = pdfdocument()
    doc.loadfromfile(pdf_path)

    if page_number < 1 or page_number > doc.pages.count:
        print(f"无效页码 {page_number}。")
        doc.close()
        return

    page = doc.pages.get_item(page_number - 1)

    # 定义提取区域 (rectanglef)
    # 这里的坐标系统通常以点为单位,原点在页面左下角或左上角,
    # 具体的原点位置和单位可能需要根据实际pdf和库的实现进行调整。
    # spire.pdf通常使用左上角为原点,单位为点。
    extract_area = rectanglef.fromltrb(x, y, x + width, y + height)

    text_extractor = pdftextextractor(page)
    options = pdftextextractoptions()
    options.extractarea = extract_area  # 设置提取区域

    region_text = text_extractor.extracttext(options)

    with open(output_txt_path, "w", encoding="utf-8") as f:
        f.write(region_text)

    doc.close()
    print(f"从 {pdf_path} 第 {page_number} 页的指定区域提取文本并保存到 {output_txt_path}")

# 示例用法:假设我们想从第1页的 (100, 100) 位置开始,提取一个 200x50 的区域
pdf_file = "sample.pdf"
extract_region_text(pdf_file, 1, 20, 200, 200, 80, "sample_region_text.txt")

提取结果示例:

提示: 确定精确的x, y, width, height值可能需要一些尝试,或者使用pdf阅读器(如adobe acrobat)的测量工具来辅助定位。

处理表格数据提取

表格是pdf文档中常见的结构化数据形式。spire.pdf for python提供了识别和提取pdf中表格数据的功能,这对于自动化数据录入和分析至关重要。

from spire.pdf import *
from spire.pdf.common import *
import csv
import os

def extract_tables_from_pdf(pdf_path, output_dir):
    """
    从pdf文档中提取所有表格数据,并分别保存为csv文件。
    每个表格对应一个csv文件。
    """
    doc = pdfdocument()
    doc.loadfromfile(pdf_path)

    # 如果输出目录不存在,则创建
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    table_count = 0

    for i in range(doc.pages.count):

        # 创建 pdftableextractor 对象
        table_extractor = pdftableextractor(doc)

        # 查找页面中的表格(true 表示自动检测)
        tables = table_extractor.extracttable(i)

        if tables:
            print(f"在第 {i + 1} 页找到 {len(tables)} 个表格。")

            for table_index, table in enumerate(tables):
                table_count += 1

                # 构造 csv 文件名
                csv_file_name = f"page_{i + 1}_table_{table_index + 1}.csv"
                csv_file_path = os.path.join(output_dir, csv_file_name)

                # 写入 csv 文件
                with open(csv_file_path, mode="w", newline="", encoding="utf-8-sig") as csv_file:
                    writer = csv.writer(csv_file)

                    for row_index in range(table.getrowcount()):
                        row_data = []
                        for column_index in range(table.getcolumncount()):
                            cell_text = table.gettext(row_index, column_index)
                            row_data.append(cell_text)
                        writer.writerow(row_data)

                print(f"表格已保存:{csv_file_path}")

    doc.close()

    if table_count == 0:
        print(f"未在 {pdf_path} 中找到任何表格。")
    else:
        print(f"共提取并保存了 {table_count} 个表格。")

# 示例用法
extract_tables_from_pdf("sample.pdf", "output_csv")

提取结果示例:

代码解释:

  1. pdftableextractor(doc):创建表格提取器。
  2. table_extractor.extracttable(page_index):尝试自动检测并提取指定页面中的表格。
  3. table.getrowcount()table.getcolumncount():获取表格的行数和列数。
  4. table.gettext(row_index, column_index):获取特定单元格的文本内容。
  5. 我们使用pandas库将提取到的表格数据转换为dataframe,并保存到excel文件,这是一种常见的结构化数据处理方式。

常见挑战与spire.pdf for python的应对

pdf文本提取并非总是一帆风顺,尤其是在面对复杂或质量不佳的pdf文件时。

  • 扫描件pdf的文本提取 (ocr功能): 传统的文本提取库对扫描件pdf无能为力,因为它们本质上是图像。spire.pdf for python内置了ocr(光学字符识别)功能,能够识别图像中的文字,从而实现扫描件pdf的文本提取。在pdftextextractoptions中配置ocr相关参数即可启用。
  • 多语言文本处理: spire.pdf for python支持多种语言的文本提取,这对于处理国际化文档至关重要。其内部机制能够识别不同的字符编码和字体。
  • 布局混乱与非标准pdf: 对于布局异常或不符合pdf规范的文档,文本提取可能会遇到挑战。spire.pdf for python通过其强大的解析引擎,尽可能地还原文本的逻辑结构,但在极端情况下,可能需要额外的后处理来完善提取结果。
  • 异常处理和错误管理: 在实际应用中,文件损坏、权限问题等都可能导致提取失败。建议在代码中加入try-except块来捕获和处理这些异常,提高程序的健壮性。

总结

spire.pdf for python为python开发者提供了一套全面而强大的工具集,用于高效、准确地从pdf文档中提取文本。无论是简单的全文提取,还是复杂的区域和表格数据抽取,它都能提供可靠的解决方案。通过本文的详细指导和代码示例,您应该已经掌握了使用该库进行pdf文本提取的核心技能。

以上就是python利用spire.pdf for python库抽取pdf文档文本的详细内容,更多关于python抽取pdf文档文本的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com