Python PDF自动化处理指南:从文本提取到合并拆分实战
2026/9/4 21:45:37 网站建设 项目流程

在日常办公中,PDF 是出现频率最高的文档格式之一:合同归档、简历筛选、报表存档、电子书阅读、扫描件分发,几乎每一个环节都会遇到它。当手里只有几个 PDF 文件时,手动打开、查看、复制、另存都还能接受;但当某个文件夹里躺着上百个 PDF,业务方又要求“把前 30 页合并成一个文件”“把这些合同里的关键信息抽出来填到 Excel”时,手动操作就变成了纯体力活。

这篇文章是“Python 办公自动化之 PDF 了解”系列的第一篇,目标是帮大家先把 PDF 处理的基础框架搭起来。我们会先搞清楚 PDF 为什么这么“难搞”,再梳理 Python 生态中几个主流 PDF 库分别适合什么场景,最后用多个可复制的实战示例把读取信息、提取文本、合并拆分、解析表格和图片这些日常需求走一遍。读完这一篇,即使你以前没写过 PDF 处理代码,也能照着示例完成自己的第一个 PDF 批量处理脚本。

1. 背景与核心概念

1.1 PDF 是什么,为什么办公自动化绕不开它

PDF(Portable Document Format,便携式文档格式)是 Adobe 在 1993 年推出的固定版式文档格式。所谓“固定版式”,可以理解为:一个 PDF 文件无论在 Windows、macOS、Linux,还是在手机、打印机上打开,页面排版、字体、图片位置都保持一致。

这个特性让 PDF 成为正式文件交换的标准格式,但也带来一个问题:PDF 并不像 Word、HTML 那样适合“流式读取”和“动态编辑”。Word 文档本质上是一堆文字流和样式规则,HTML 文档则是标签化的结构化内容;而 PDF 更像一张“数字照片”,它记录的是每个对象应该出现在页面哪个坐标位置。虽然文字仍然是文字、图片仍然是图片,但它们的组织方式更偏向“呈现”,而不是“语义”。

这也是办公自动化必须面对 PDF 的原因:

  • 大量业务文件最终都以 PDF 形式存档和流转。
  • PDF 中蕴含的文本、表格、图片、表单数据需要被二次利用。
  • 手工处理 PDF 文件效率低、易出错、不利于重复执行。

所以,用 Python 写脚本去批量处理 PDF,自然成了办公自动化的高频需求。

1.2 Python 处理 PDF 的三大方向

从功能维度看,Python 处理 PDF 可以分为三个方向。

第一个方向是“读取与解析”。比如读取页数、标题、作者等元数据,提取页面中的文字、表格、图片,这是办公自动化中最常见的需求。

第二个方向是“编辑与重组”。比如合并多个 PDF、拆分单个 PDF、旋转页面、插入空白页、删除指定页。这一类的特点是“不改变内容本身,只改变文件结构和页面顺序”。

第三个方向是“生成与转换”。比如把文本、图片、报表数据生成 PDF;把 PDF 文档转换为 Word、Excel、图片;这里还包括对扫描版 PDF 进行 OCR 识别(将图片里的文字识别出来)。

在“PDF 了解”这个阶段,我们重点先掌握第一个方向和第二个方向,因为它们是后续学习和解决业务问题的基础。转换类需求虽然实用,但往往依赖文件的具体排版,细节较多,后面单独展开。

1.3 最容易踩的坑:文字版 PDF 与扫描版 PDF

学习 PDF 自动化之前,有一个概念必须建立:同样是 PDF,内部构造可能完全不同。

用 Word、WPS、LaTeX、浏览器打印生成的 PDF,通常带有一层“文本层”。文字以字符编码的形式存储在文件里,你可以直接选中、复制,也可以被程序直接提取出来。这种 PDF 叫“文字版 PDF”,也是 Python 解析最顺利的一类。

但还有一种 PDF 来自扫描仪或传真机,本质上是把纸质文件拍成或扫成一张张图片再封装成 PDF。这类 PDF 从视觉上看有文字,但程序去提取时往往什么都拿不到,因为文字只是图像中的像素,根本没有“字符”这个概念。这种 PDF 俗称“扫描版 PDF”或“图片型 PDF”。

判断一个 PDF 是文字版还是扫描版,最直接的办法是用 PDF 阅读器试着选中一段文字并复制。如果复制出来是乱码或空白,那基本就是扫描版。处理扫描版 PDF 需要走 OCR 路线,而 OCR 属于另一个技术方向,本文不深入展开,但在第 5 节排错里会告诉你如何识别它。

2. 环境准备与版本说明

2.1 Python 环境与项目结构

本文所有示例均在 Python 3 环境下编写和运行。建议先创建一个独立的虚拟环境,避免把包安装到全局环境里和系统其他项目冲突:

python -m venv venv

激活虚拟环境:

  • Windows 下:
venv\Scripts\activate
  • macOS / Linux 下:
source venv/bin/activate

激活后,命令行提示符前面通常会出现(venv)字样,说明已经进入虚拟环境。

然后建议按下面的目录结构准备一个实验目录,把后面用到的 PDF 文件都放进去:

pdf_demo/ ├── data/ │ ├── 原始PDF/ │ │ ├── 合同A.pdf │ │ ├── 合同B.pdf │ │ └── 报表.pdf │ └── 输出/ └── scripts/

没有现成 PDF 文件的话,可以用 Word、WPS 或浏览器打印功能,随便生成几个简单 PDF 用于测试。

2.2 需要安装的 Python 库

Python 生态中 PDF 相关库很多,为了避免安装一堆后不知道用哪个,本文先介绍最常用的五个库。执行下面的命令,可以一次性安装:

pip install pypdf pdfplumber PyMuPDF pdf2docx

各库的作用如下表所示:

库名pip 包名导入名主要用途
pypdfpypdfpypdf读取页数、元数据,合并、拆分、旋转 PDF
pdfplumberpdfplumberpdfplumber提取文本、表格,解析字符坐标信息
PyMuPDFPyMuPDFfitz高性能解析 PDF,支持提取文本、图片、渲染页面
pdf2docxpdf2docxpdf2docx把 PDF 转换成 Word 文档

有朋友之前用过PyPDF2。早期很多项目使用PyPDF2,后来社区逐渐把维护工作集中到了pypdf这个继承项目上。新项目建议直接安装pypdf,引入方式为from pypdf import PdfReader。如果你在旧代码里看到PyPDF2,可以把旧库卸载后使用pypdf,绝大部分 API 是兼容的。具体版本可以按自己当前项目时间选择,重点掌握配置思路,而不必把某一版 API 背死。

3. 核心概念与基础 API 拆解

3.1 使用 pypdf 读取 PDF 基本信息

当我们拿到一个陌生 PDF 时,第一件事通常是了解它有多少页、作者是谁、标题是什么。pypdf 的PdfReader可以完成这件事。

# 文件路径:scripts/read_basic_info.py from pypdf import PdfReader reader = PdfReader("data/原始PDF/合同A.pdf") print("页数:", len(reader.pages)) meta = reader.metadata if meta: print("标题:", meta.title) print("作者:", meta.author) print("创建工具:", meta.creator) print("是否加密:", reader.is_encrypted)

需要注意,len(reader.pages)返回的是PageObject组成的列表长度,也就是 PDF 的页数。reader.metadata可能为None,因此读取前先做一个判断更保险。reader.is_encrypted表示该 PDF 是否有密码保护。如果 PDF 设置了打开密码,直接访问页面会报错,需要先调用reader.decrypt("密码")

3.2 使用 pypdf 提取页面文本

pypdf 提供了extract_text()方法提取页面中的文字,适合文本结构清晰的 PDF:

# 文件路径:scripts/extract_text_pypdf.py from pypdf import PdfReader reader = PdfReader("data/原始PDF/合同A.pdf") for index, page in enumerate(reader.pages, start=1): text = page.extract_text() print(f"===== 第 {index} 页 =====") print(text)

这个 API 很简单,但实际项目中人们却发现它有时提取出的文字顺序不对,或者出现多余换行。原因是 PDF 文件内部把文字按“绘制位置”存储,而不是按“阅读顺序”存储。extract_text()只能尽量还原,遇到复杂分栏、图文混排时,结果可能不太理想。

所以要建立一个意识:pypdf 适合简单场景、快速预览;对复杂版式 PDF,需要交给 pdfplumber 或 PyMuPDF 这类更精细的库。

3.3 使用 pdfplumber 提取文本和表格

pdfplumber 的底层基于 pdfminer.six,它不仅能提取文本,还能拿到每个字符的坐标、字体大小等信息。这使得它特别适合处理含表格、含明细数据的 PDF。

提取文本的写法如下:

# 文件路径:scripts/extract_text_pdfplumber.py import pdfplumber with pdfplumber.open("data/原始PDF/报表.pdf") as pdf: for page_index, page in enumerate(pdf.pages, start=1): text = page.extract_text() print(f"===== 第 {page_index} 页 =====") print(text)

提取表格的写法稍微复杂一点,但逻辑很直观:

# 文件路径:scripts/extract_tables_pdfplumber.py import pdfplumber with pdfplumber.open("data/原始PDF/报表.pdf") as pdf: for page_index, page in enumerate(pdf.pages, start=1): tables = page.extract_tables() print(f"第 {page_index} 页找到 {len(tables)} 个表格") for table_index, table in enumerate(tables, start=1): print(f"第 {page_index} 页 - 第 {table_index} 个表格内容:") for row in table: print(row)

extract_tables()返回的是一个三维列表:第一层是多个表格,第二层是每个表格里的多行数据,第三层是每行里的单元格。单元格的值可能是字符串,也可能是None(表示空单元格)。如果某个单元格里是图片或无法识别的内容,同样会是None

这里要特别说明:PDF 表格并不像 Excel 那样有严格的“表格结构”概念。pdfplumber 是通过识别页面上的直线、文字坐标,再推断单元格边界。如果 PDF 里的表格没有明显线条,而是用背景色、空白间距来区分列,extract_tables()可能无法正确识别。遇到这种情况,可以尝试page.extract_table()(单表格模式)或调参table_settings,另外也可以通过文字坐标自行组装数据。

3.4 使用 PyMuPDF 提取文本和图片

PyMuPDF 对应的导入名是fitz,这是一个神奇又强大的库。它的解析速度通常比 pdfplumber 快,而且对中文支持较好。很多 PDF 文字提取失败的场景,换 PyMuPDF 后往往就能成功。

# 文件路径:scripts/extract_text_pymupdf.py import fitz doc = fitz.open("data/原始PDF/合同A.pdf") for page_index in range(len(doc)): page = doc.load_page(page_index) # 也可以使用 doc[page_index] text = page.get_text() print(f"===== 第 {page_index + 1} 页 =====") print(text) doc.close()

PyMuPDF 还可以把 PDF 页面渲染成图片,也可以提取 PDF 中的图片,这在第 4 节实战中会看到。

3.5 使用 pypdf 合并拆分 PDF

pypdf 处理 PDF 重组的核心是PdfWriter。合并的思路是:创建 writer,遍历所有输入 PDF 的每一页并加入 writer,最后写入输出文件。

# 文件路径:scripts/merge_pdfs.py from pathlib import Path from pypdf import PdfWriter, PdfReader pdf_dir = Path("data/原始PDF") output_path = Path("data/输出/合并.pdf") writer = PdfWriter() pdf_file_list = sorted(pdf_dir.glob("*.pdf")) for pdf_file in pdf_file_list: reader = PdfReader(pdf_file) for page in reader.pages: writer.add_page(page) output_path.parent.mkdir(parents=True, exist_ok=True) with output_path.open("wb") as output_file: writer.write(output_file) print(f"成功合并 {len(pdf_file_list)} 个 PDF 文件到:{output_path}")

拆分 PDF 的思路正好相反:先打开一个大的 PDF,把需要的某几页单独加到新的 writer 中,然后写出去。注意 PDF 的页码索引从 0 开始,所以“第 1 页”在代码里对应索引0

# 文件路径:scripts/split_pdf.py from pypdf import PdfWriter, PdfReader reader = PdfReader("data/原始PDF/合同A.pdf") start = 0 # 要拆分的起始页码,这里表示从第 1 页开始 end = 2 # 要拆分的结束页码,这里表示到第 3 页结束(不含索引 3) writer = PdfWriter() for page_index in range(start, end): writer.add_page(reader.pages[page_index]) output_path = "data/输出/合同A_前3页.pdf" with open(output_path, "wb") as output_file: writer.write(output_file) print(f"已拆分 {end - start} 页,输出到:{output_path}")

如果要拆分成“每页一个 PDF”,可以在循环里为每一页创建一个PdfWriter并保存。

4. 完整实战案例

4.1 需求描述

假设你是公司行政人员,手头有一个data/原始PDF文件夹,里面散落着十几份 PDF 合同和报表。现在需要完成三项任务:

  1. 批量统计每个 PDF 的页数、标题等基本信息,并输出成一份汇总文本。
  2. 把某一份多页合同拆成“前 3 页”和“剩余页”两部分。
  3. 把文件夹内所有 PDF 合并成一个总文件,方便统一存档。

这套需求非常适合用脚本自动化。下面我们动手实现一个相对完整的小工具。

4.2 批量扫描 PDF 目录并生成汇总信息

先写一个函数,它遍历指定目录下的所有.pdf文件,读取每个文件的基本信息并返回列表。

# 文件路径:scripts/pdf_folder_scanner.py from pathlib import Path from pypdf import PdfReader def scan_pdf_folder(folder_path: str): pdf_folder = Path(folder_path) result_lines = [] if not pdf_folder.exists(): print(f"目录不存在:{pdf_folder}") return result_lines # 这里使用 rglob 可以递归查找所有子目录下的 PDF for pdf_file in sorted(pdf_folder.rglob("*.pdf")): try: reader = PdfReader(pdf_file) meta = reader.metadata title = meta.title if meta and meta.title else "无标题" page_count = len(reader.pages) size_kb = pdf_file.stat().st_size / 1024 line = f"文件名:{pdf_file.name}|页数:{page_count}|大小:{size_kb:.1f} KB|标题:{title}" result_lines.append(line) print(line) except Exception as exc: # 避免单个文件出错导致整个任务中断 error_line = f"文件名:{pdf_file.name}|读取失败:{exc}" result_lines.append(error_line) print(error_line) return result_lines if __name__ == "__main__": lines = scan_pdf_folder("data/原始PDF") output_file = Path("data/输出/PDF信息汇总.txt") output_file.parent.mkdir(parents=True, exist_ok=True) output_file.write_text("\n".join(lines), encoding="utf-8") print(f"\n汇总结果已写入:{output_file}")

这里有几个工程上的小细节值得注意:

  • 使用pathlib.Path而不是直接拼字符串路径,避免不同操作系统路径分隔符的差异。
  • 定期调用pdf_file.stat().st_size获取文件大小,单位为字节,除以 1024 后转为 KB。
  • 用一次性try-except包裹单文件处理,符合“办公自动化批量任务不让单点失败中断整体”的思路。

运行后,预期会在控制台看到每条 PDF 的基本信息,同时目录data/输出下会生成一份PDF信息汇总.txt

4.3 批量合并与拆分 PDF

下面把合并和拆分功能封装成两个独立函数,方便以后复用:

# 文件路径:scripts/pdf_merge_split.py from pathlib import Path from pypdf import PdfWriter, PdfReader def merge_pdfs(pdf_paths, output_path): writer = PdfWriter() for pdf_path in pdf_paths: reader = PdfReader(pdf_path) for page in reader.pages: writer.add_page(page) output_path = Path(output_path) output_path.parent.mkdir(parents=True, exist_ok=True) with output_path.open("wb") as f: writer.write(f) print(f"合并完成,共 {len(pdf_paths)} 个文件,输出:{output_path}") def split_pdf(pdf_path, output_path, start_page, end_page): reader = PdfReader(pdf_path) writer = PdfWriter() for page_index in range(start_page, end_page): writer.add_page(reader.pages[page_index]) output_path = Path(output_path) output_path.parent.mkdir(parents=True, exist_ok=True) with output_path.open("wb") as f: writer.write(f) print(f"拆分完成,输出:{output_path}") if __name__ == "__main__": source_dir = Path("data/原始PDF") # 1. 合并所有 PDF pdf_files = sorted(source_dir.glob("*.pdf")) merge_pdfs(pdf_files, "data/输出/全部合并.pdf") # 2. 拆出“合同A.pdf”的前 3 页 contract_a = source_dir / "合同A.pdf" split_pdf(contract_a, "data/输出/合同A_前3页.pdf", start_page=0, end_page=3)

合并前,最好用sorted()对文件列表排序。文件系统接口返回的文件顺序不一定固定,如果不排序,合并后的 PDF 顺序每次都可能不同。

4.4 提取 PDF 中的文本、表格和图片

现实中我们不只是要“切开”PDF,更要“挖出”里面的内容。这里写一个综合脚本,把 pypdf、pdfplumber、PyMuPDF 配合起来,分别完成“按页提取文本”“提取第一张表格”“提取全部图片”三个子任务。

# 文件路径:scripts/pdf_extract_content.py import fitz import pdfplumber TARGET_PDF = "data/原始PDF/报表.pdf" def extract_text_by_pdfplumber(pdf_path): with pdfplumber.open(pdf_path) as pdf: full_text = [] for page in pdf.pages: page_text = page.extract_text() if page_text: full_text.append(page_text) return "\n".join(full_text) def extract_table_by_pdfplumber(pdf_path): with pdfplumber.open(pdf_path) as pdf: for page_index, page in enumerate(pdf.pages, start=1): tables = page.extract_tables() if tables: return page_index, tables[0] return None, None def extract_images_by_pymupdf(pdf_path, output_dir="data/输出/images"): import os os.makedirs(output_dir, exist_ok=True) doc = fitz.open(pdf_path) saved_paths = [] for page_index in range(len(doc)): page = doc.load_page(page_index) images = page.get_images(full=True) for img_index, img in enumerate(images, start=1): xref = img[0] # 图像对象的引用编号 base_image = doc.extract_image(xref) image_bytes = base_image["image"] ext = base_image["ext"] image_path = os.path.join(output_dir, f"page{page_index + 1}_img{img_index}.{ext}") with open(image_path, "wb") as f: f.write(image_bytes) saved_paths.append(image_path) doc.close() return saved_paths if __name__ == "__main__": print("===== 提取文本前 500 字 =====") text = extract_text_by_pdfplumber(TARGET_PDF) print(text[:500]) print("\n===== 提取第一个表格 =====") page_no, first_table = extract_table_by_pdfplumber(TARGET_PDF) if first_table: print(f"第一个表格位于第 {page_no} 页") for row in first_table: print(row) else: print("未检测到表格,请确认 PDF 是否包含标准横线表格。") print("\n===== 提取图片 =====") image_list = extract_images_by_pymupdf(TARGET_PDF) print(f"共提取到 {len(image_list)} 张图片")

这段代码体现了不同库的分工:pdfplumber 负责文本和表格提取,PyMuPDF 负责快速提取图片。在某些场景下,你甚至可以用 PyMuPDF 把每一页渲染成 PNG 图片,用作预览图:

import fitz doc = fitz.open("data/原始PDF/报表.pdf") for page_index in range(len(doc)): page = doc.load_page(page_index) pix = page.get_pixmap(dpi=100) pix.save(f"data/输出/page{page_index + 1}.png") doc.close()

4.5 运行与验证

data/原始PDF下的测试文件运行上面这些脚本时,控制台会输出类似于下面的内容:

文件名:合同A.pdf|页数:5|大小:312.5 KB|标题:XX项目服务合同 文件名:报表.pdf|页数:3|大小:208.3 KB|标题:2025年1月销售报表 文件名:合同B.pdf|页数:8|大小:450.1 KB|标题:无标题

如果 PDF 文件是从 Word 导出的,通常metadata.title会有值;如果是某些在线工具生成的,则可能没有标题。出现“无标题”不代表文件损坏,只是文件中没有写入元数据而已。

你可以打开输出目录中的文件,用 PDF 阅读器确认“合并.pdf”“拆分出来的前 3 页”是否正常。表格和图片的提取结果则取决于源 PDF 的复杂程度,不一定每次都能完美复原。

5. 常见问题与排查思路

第一次接触 PDF 自动化时,往往会遇到下面这些报错或异常。我把高频问题整理成一张速查表,方便你快速对照。

问题现象常见原因解决思路
ModuleNotFoundError: No module named 'pypdf'当前 Python 环境没有安装 pypdf在虚拟环境中执行pip install pypdf
下载报错或速度慢网络源不稳定使用国内镜像源安装,例如pip install pypdf -i https://pypi.tuna.tsinghua.edu.cn/simple
PdfReader打开文件时报 “Not a PDF”文件不是真正的 PDF,或文件扩展名是 PDF 但内容损坏用 PDF 阅读器打开测试;检查文件后缀与真实内容是否一致
extract_text()返回空字符串可能是扫描版 PDF,没有文本层用 PDF 阅读器选中文字测试;若无法选中,则需要 OCR 工具
提取中文乱码PDF 字体编码特殊,或 pypdf 兼容性不够改成 pdfplumber 或 PyMuPDF 提取;必要时调整字体映射
PDF 设置了密码文件已加密先调用reader.decrypt("密码"),密码需要你合法拥有
extract_tables()找不到表格PDF 表格没有标准横线结构,或表格是图片人工打开确认表格以什么形式存在;考虑 OCR 或坐标定位
合并后的 PDF 顺序混乱文件列表没有排序使用sorted()对路径进行排序
生成的 TXT 文件中文乱码读写文件未指定 UTF-8 编码open(..., encoding="utf-8"),或Path.write_text(..., encoding="utf-8")
PyMuPDF 安装报错Python 版本或系统架构与包不兼容升级 Python 到 3.8 以上;从预编译 wheel 安装

下面挑两个典型问题展开讲一下。

问题一:PDF 明明有文字,为什么提取出来是空的?

这种情况十有八九是扫描版 PDF。你可以先做一个快速验证:用浏览器或 PDF 阅读器打开文件,尝试用鼠标选中任意一段文字。如果选不中,或选中后显示的是一整块图片区域,就基本断定这是图片型 PDF。此时,提取文字的常规方案失效,需要引入 OCR 引擎,例如 Tesseract、PaddleOCR,或 PDF 转图片后再调用 OCR API。OCR 本身内容量较大,属于后续进阶话题。

问题二:同一个 PDF,pypdf 提取文本正常,pdfplumber 却提取为空?

每个库在解析 PDF 内部指令时的策略不同。pypdf 对某些内容流提取时更宽松,pdfplumber 则更严格,它可能为了保持字符位置信息而放弃一部分解析。反过来也常见:pypdf 提取乱序,pdfplumber 却能给出比较正常的结果。因此,遇到提取质量问题时,不要死磕一个库,多换一个库做交叉验证。

6. 最佳实践与工程建议

结合实际项目经验,最后给出几条建议。这些建议不一定能让你立刻解决某个具体问题,但能帮你避开办公自动化项目里的常见坑。

第一,文件路径优先使用pathlib.Pathpathlib是 Python 3 内置的路径处理模块,它既能拼接路径,又能统一处理正反斜杠,还能直接写文件。项目代码中直接写"data/原始PDF/xxx.pdf"没问题,但跨平台或复杂目录结构下,建议换成Path对象。

第二,处理多个文件时,永远是“单个文件失败不让整体中断”。办公自动化的大忌是一个脚本运行到第 20 个文件时报错,前面 19 个文件处理结果全被异常打断。更好的做法是把每个文件的处理包在try-except中,把失败文件路径和错误信息记录到一个失败清单里,等全部处理完毕后统一查看。

第三,做任何文件转换或拆分合并之前,先备份原始文件。PDF 处理通常不直接改原文件,而是生成新文件,这已经很安全。但仍要确保逻辑正确后再大批量操作。测试时建议使用副本数据,不要在生产业务数据上直接跑不成熟的脚本。

第四,批量处理时注意内存占用。pypdf、pdfplumber 处理的都是在内存中展开的文档结构,如果一次性合并几百个超大 PDF,内存可能飙升。此时可以分批处理,比如每 20 个文件先合并成一个小文件,最后再合并中间文件。

第五,优先解决“数据从哪里来,到哪里去”。办公自动化的核心不是写一段漂亮的代码,而是把输入和输出设计清楚。比如从 PDF 提取表格数据之后,要明确是输出为 CSV、Excel,还是直接写入数据库。推荐先把数据整理成统一的中间格式(如 DataFrame 或列表字典),再做后续写入,避免每个流程都从头解析 PDF。

第六,在正式读取加密 PDF 前,务必确认你拥有合法授权。办公场景中,很多合同和财务文件都带访问权限。处理这类文件时,如果无法提供密码或者没有授权,应该直接跳过并在日志中记录,而不是尝试破解或绕过限制。

第七,保留处理的日志和结果摘要。写脚本时不要只 print 到控制台,建议同时把日志写入文件。这样即使脚本跑完后很久再回溯,也能知道当时处理了多少页面、成功了多少份、哪些文件失败了。

7. 总结与下一步

这篇内容属于“办公自动化 → PDF 了解”的第一部分。重点不是让你记住某个库的所有 API,而是建立起“PDF 为什么难处理”和“不同场景应该选什么库”的意识。你至少应该能回答出下面几个问题:

  • PDF 是固定版式文档,文字以坐标和内容流的形式存储,不一定按阅读顺序排列。
  • pypdf 适合读基本信息、合并拆分;pdfplumber 适合文本和表格精细解析;PyMuPDF 适合高性能解析、提取图片和渲染预览;pdf2docx 则用于转 Word。
  • 扫描版 PDF 没有文本层,无法直接提取文字,需要 OCR。
  • 批量处理脚本必须考虑单个文件失败、路径跨平台、输出目录自动创建等工程问题。

如果你想继续深入,下一阶段可以尝试把 PDF 中的表格批量导出到 Excel,或者把一堆扫描版 PDF 通过 OCR 自动识别成可搜索的文本,也可以研究如何用 Python 自动生成一份带目录和页码的 PDF 报表。

实际项目中,优先级最高的不是“多复杂的技巧”,而是先保证“输入文件能读、读取结果可验证、输出文件不污染原数据”。把这三点做好,你的 PDF 办公自动化基础就算是扎实了。后续我会继续更新 pdf 转换、批量处理与 OCR 实战,如果你正准备在业务里处理大量 PDF,可以先把这个目录结构跑通,后面只需要不断往里面加新的处理函数即可。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询