当前位置:首页 > 技术 > 正文内容

高效文本提取:利用 Python 的 pdftotext 自动化处理文档

访客 技术 2026年7月26日 1

在处理海量数字化文档时,从 PDF 中精准提取文本内容是一项核心需求。pdftotext 是一个基于高性能 Poppler 引擎的 Python 库,凭借其轻量级 API 和跨平台兼容性,成为了开发者解析 PDF 数据的理想选择。

核心技术部署

该库支持在 Windows、macOS 以及各种 Linux 发行版上运行,安装前需确保底层 Poppler 依赖已正确配置。例如,在 Ubuntu 系统中,可通过以下方式安装依赖:

sudo apt install libpoppler-cpp-dev pkg-config python3-dev

完成依赖配置后,执行标准安装命令即可:

pip install pdftotext

基础代码实现

通过 Python 脚本加载并提取文档内容仅需极简逻辑:

import pdftotext

# 以二进制只读模式加载文档
with open("report.pdf", "rb") as source:
    document = pdftotext.PDF(source)

# 输出文档统计信息
print(f"总页数: {len(document)}")

# 遍历页面提取内容
for index, page_content in enumerate(document, start=1):
    print(f"--- 第 {index} 页 ---")
    print(page_content[:150]) # 预览部分文本

处理加密与批量作业

针对带有密码保护的文档,可以通过构造函数传入权限密钥;对于自动化批量任务,建议结合 pathlib 模块实现:

import pdftotext
from pathlib import Path

def process_secure_pdf(file_path, key):
    with open(file_path, "rb") as f:
        pdf = pdftotext.PDF(f, password=key)
        return "\n".join(pdf)

# 批量转换目录下的 PDF
def batch_convert(input_dir, output_dir):
    input_path = Path(input_dir)
    for file in input_path.glob("*.pdf"):
        with open(file, "rb") as f:
            data = pdftotext.PDF(f)
            output_path = Path(output_dir) / f"{file.stem}.txt"
            output_path.write_text("\n".join(data), encoding="utf-8")

布局控制与深度分析

pdftotext 提供了不同的解析模式以适应文档排版需求。例如,通过设置 physical=True,可以将字符按其在页面上的物理坐标进行排列,这在处理多栏布局时尤为有效:

with open("layout.pdf", "rb") as f:
    # 物理模式:保持视觉排版顺序
    physical_text = pdftotext.PDF(f, physical=True)
    
    # 结合正则表达式进行信息提取
    import re
    full_text = "\n".join(physical_text)
    pattern = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
    emails = pattern.findall(full_text)
    print(f"发现邮箱地址: {emails}")

性能优化策略

面对超大规模 PDF 文件,为了规避内存超限,建议采用分页迭代或多进程并行处理技术。利用 concurrent.futures 可以大幅缩短处理时长:

from concurrent.futures import ProcessPoolExecutor

def worker(path):
    with open(path, "rb") as f:
        return len(pdftotext.PDF(f))

files = list(Path("./docs").glob("*.pdf"))
with ProcessPoolExecutor(max_workers=4) as executor:
    results = list(executor.map(worker, files))

实践建议

  • 异常处理:在生产环境中,请务必使用 try-except 块捕获 pdftotext.Error,以防文件损坏或读取超时。
  • 资源管理:对于极大型文件,应通过批处理而非一次性加载全文。
  • 文本清洗:提取出的纯文本往往包含冗余空白字符,建议在后续处理中使用 str.strip() 或正则进行归一化。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。