用 pdftotext 和 Python 把 PDF 批量转成可检索文本的配置方法

PDF 解析配置的核心不是装哪个库,而是先分清手里的 PDF 属于哪一类:文本型 PDF 可以直接抽取文字,扫描型 PDF 本质是图片,必须走 OCR。
配置顺序应当是先判断类型,再选工具,最后用字符数和页面抽查验证结果。
下面按这个顺序给出可执行的步骤,环境以常见 Linux 服务器为例。

先判断 PDF 是文本型还是扫描型

在装任何工具之前,先用系统自带命令看一眼文件里有没有文本层。
最省事的办法是安装 poppler-utils 后执行 pdftotext,看输出是否为空。

# Debian/Ubuntu
sudo apt update && sudo apt install -y poppler-utils

# 抽取前 3 页文本做探测
pdftotext -f 1 -l 3 sample.pdf - | head -n 40

如果终端能打印出成段的文字,说明是文本型 PDF,后续用文本抽取方案即可;
如果输出为空或只有零星页码,多半是扫描件,需要 OCR。
也可以用 pdfinfo sample.pdf 查看页数和文件基本信息,帮助判断文件是否完整。

这一步的判断结果直接决定后面的配置方向,跳过它很容易出现“脚本跑完但全是空字符串”的情况。

文本型 PDF 的两种抽取方式

命令行方案 pdftotext 适合批量、无需复杂版面分析的场景。
常用参数里,-layout 尽量保留原始排版,-enc UTF-8 明确输出编码,处理中文文档时建议加上。

pdftotext -layout -enc UTF-8 sample.pdf sample.txt

Python 方案 pdfplumber 适合需要按页处理、后续接入解析流水线的场景。
安装依赖:

python3 -m pip install pdfplumber

最小抽取脚本如下,逐页读取并写入独立文本文件:

import pdfplumber

with pdfplumber.open("sample.pdf") as pdf:
    for i, page in enumerate(pdf.pages, start=1):
        text = page.extract_text() or ""
        with open(f"page_{i}.txt", "w", encoding="utf-8") as f:
            f.write(text)
        print(i, len(text))

运行后每页会打印字符数,字符数长期为 0 的页面就是需要重点检查的对象。
两种方式都不依赖联网,适合在服务器上做离线批处理。

批量处理与扫描件识别

批量场景建议把上面两步组合起来:先用 pdftotext 快速抽一遍,再按字符数阈值判断哪些文件需要转 OCR。
下面是一个可用的批量脚本思路:

mkdir -p out
for f in *.pdf; do
  base="${f%.pdf}"
  pdftotext -layout -enc UTF-8 "$f" "out/$base.txt"
  chars=$(wc -m < "out/$base.txt")
  if [ "$chars" -lt 50 ]; then
    echo "需要OCR: $f (字符数 $chars)"
  fi
done

阈值 50 只是起步参考,实际要按文档类型调整:纯表格或封面页字符数天然偏少,不要一刀切判定为扫描件。
对判定需要 OCR 的文件,先安装 tesseract-ocr 和中文语言包 tesseract-ocr-chi-sim,再把 PDF 转成图片后识别。
这一步的配置细节取决于服务器是否已装图像处理依赖,务必先在单页上验证识别效果,再批量跑。

常见问题:乱码、空结果和排版错乱

中文乱码通常来自编码参数缺失或字体嵌入问题。
命令行方案先确认使用了 -enc UTF-8,Python 写文件时显式指定 encoding="utf-8"。
若仍乱码,用 pdffonts sample.pdf 查看字体是否嵌入,未嵌入字体的 PDF 抽取结果可能不可靠。

整篇为空优先怀疑扫描件,而不是工具装错。
回到第一步的探测命令复测,确认后再决定是否接 OCR。

排版错乱多发生在多栏或表格文档上。-layout 能改善一部分,但复杂表格用 pdfplumber 的表格抽取接口更合适,不要指望纯文本模式还原结构。

权限与路径问题在批量脚本里很常见:确认输出目录存在、脚本对源目录有读权限,文件名含空格时变量要加引号。

验证解析结果是否可用

解析配置完成后不要只看脚本是否报错,至少做三项检查:

  • 统计每个输出文件的字符数,列出明显偏小的文件单独复核;
  • 随机抽取 2 到 3 个 PDF,对照原文抽查首页和中间页的关键段落;
  • 用 grep 搜索一个确定存在的关键词,确认能命中。
grep -c "关键术语" out/sample.txt

只有字符数正常、关键词能命中、抽查内容与原文一致,才算解析配置真正生效。
如果后续要把文本写入检索库,建议保留页码或文件来源字段,方便回溯定位。

几个容易踩的坑

  • 不要把所有 PDF 都当成文本型,扫描件占比高的资料库必须提前规划 OCR 资源;
  • 不要在未备份的情况下覆盖原始文件,输出统一写入独立目录;
  • OCR 属于 CPU 密集型操作,批量任务建议限制并发数,避免拖垮服务器;
  • 解析结果涉及隐私文档时,注意输出目录权限,不要放在可公开访问的 Web 路径下。

按“先判类型、再选工具、最后验证”的顺序配置,PDF 解析流程基本可以稳定落地;
如果结果异常,优先回到类型判断和字符数检查这两步定位。

分享到:
上一篇
用 CSV 导入 Neo4j 知识图谱并验证查询结果
下一篇
用 Python 解析 Word 文档时怎么配置环境和处理常见格式
1
系统公告

关于香港云优质服务器IP地址更换的通知

尊敬的客户: 因原IP运营商大幅涨价,为避免成本转嫁至用户,我司决定更换IP服务商。本次更换后,您的续费价格将保持不变,且新IP网络质量与服务标准不受影响。新IP已分配至后台,即刻生效(更换的新IP都是香港原生IPv4)。 涉及 IP 段: 45.192.x.x 旧 IP 停用时间: 2026 年 12 月 1 日
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意