用 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 解析流程基本可以稳定落地;
如果结果异常,优先回到类型判断和字符数检查这两步定位。