Python PDF处理实战:从文本提取到拆分合并的办公自动化指南
2026/9/3 7:49:25 网站建设 项目流程

身为一个每天和 Word、Excel、PPT 打交道的办公人员,或是经常需要处理合同、报表、论文的技术开发者,你迟早会遇到一个绕不开的问题:PDF。

PDF 是一种极其常见的文档格式,但它和 Word 不一样,它更像一张“电子纸”,上面的内容被固定住了。这就意味着你没法像编辑 Word 那样随意修改,连复制里面的文字都经常会乱码或排版错乱。于是,很多人为了转换一个 PDF 文件到处找在线工具,结果不是要付费,就是担心文件上传到第三方服务器有泄露风险。如果处理的是合同、标书、身份证扫描件这类敏感文件,用在线工具其实非常不安全。

用 Python 来处理 PDF,并不是什么黑科技,它其实是在“读”和“写”之间寻找一种结构化的平衡。Python 可以把 PDF 从“死文档”变成“活数据”,让你能够批量提取、拆分、合并甚至自动填充。你不需要掌握多复杂的计算机知识,只要装上几个库,照着代码往下写,就能自己搭建一个本地、离线、免费的 PDF 工具箱。

这篇文章呢,我就以“办公自动化”为场景,带你从零开始认识 PDF 在 Python 眼中的样子,然后带你动手写出几个最常用的 PDF 处理脚本。不管你是刚入门 Python 的小白,还是有一定基础的开发同学,这篇文章都会给你一个清晰、能直接上手的思路。

1. 为什么办公自动化绕不开 PDF

在正式写代码之前,我们先要回答一个问题:你可能已经会处理 Excel、Word 了,为什么偏偏 PDF 是办公自动化里最让人头疼,却又必须攻克的一环?

核心原因在于交互方式的差异。Word、Excel 的本质是“内容容器”,它们的设计目标就是方便你随时修改和编辑。PDF 的全称是 Portable Document Format,它的目标是“跨平台输出不变样”。它把字体、图片、排版全部“冻结”进一个文件里,让所有设备打开都能看到同一幅画面。因此,PDF 并不像 Word 那样友好地“允许”程序直接修改内部结构。很多财务人员、行政人员每天都要在几十个 PDF 里做同样的事情:提取几行文字、把多份合同拆出来、给 PDF 加水印,或是把扫描件转成可搜索的文档。这些事情靠人工点击,一次两次还勉强能接受,如果次数多呢?枯燥、易错、还伤眼睛。

从办公自动化的角度看,PDF 处理可以分为三个层次。

第一层是“看懂它”:把 PDF 里面的文字、表格、图片识别出来。这个层次要解决的是数据录入和信息检索问题。第二层是“重排它”:按页码拆分、合并、旋转、加解密。这类操作不是在内容内部进行重排,而是对整个文档的结构进行操作。第三层是“改造它”或“生成它”:把一批 HTML、图片或数据动态填写进去,变成一份格式统一的 PDF 报告。这通常是自动化的最后一个输出环节。

我见过很多初级自动化项目,往往在开始时低估了 PDF 文本提取的复杂度。你从 PDF 中提取出的文字顺序可能不是阅读顺序而是绘制顺序,也可能是乱码。假如没有深入理解“为什么 PDF 里的文字不是天生整齐的”这个道理,你的代码测试一百遍都可能通过不了。

所以在 Python 办公自动化实践中,PDF 处理的代码逻辑往往不复杂,复杂的恰恰是你对这个格式本身的理解,以及你对第三方库边界能力的判断。这也是我写这一篇文章的初衷:先把 PDF 这件事想清楚,再去写代码,这样你会少走很多弯路。

2. PDF 在 Python 眼中的基础概念

如果你曾经尝试过用记事本打开 PDF 文件,你会看到一堆乱码。这很正常,因为 PDF 本质上是一个复杂的、带压缩和对象索引的二进制文档格式。

我建议你先把 PDF 理解成一个容器,而不是一个纯文本文件。它的内部包含多个页面对象,每个页面对象都有一份资源字典,记录了页面上使用了什么字体、什么图片、什么图形指令。它并不是像 HTML 那样按我们阅读的顺序“从上到下”存储内容的。举个很简单的例子:如果你在 PDF 里看到一个“你好”单词,它在这个文件中可能是以四个独立字符的形式存在的,每个字符都被精确地指定了坐标。这也就是为什么直接用文本方式复制 PDF 时,很可能变成一行行乱序的片段。

在 Python 生态中,要想处理好 PDF,最核心的一条原则是:按需选择工具。

如果你只是想读取 PDF 的元数据、合并拆分 PDF、写入门级的文本提取,可以优先考虑 PyPDF2 或者它的维护升级版本 pypdf。这类库在结构操作上很在行,但在复杂版式的文本提取上表现一般。

如果你需要从带有复杂排版的 PDF 里提取干净的文本,或者需要提取表格数据,推荐 pdfplumber。它在底层封装了 pdfminer.six,对坐标和划线检测做了很多优化,非常适合处理含表格的版式。

如果你需要把 PDF 转成图片,或者在图像层面做 OCR,那么 PyMuPDF(也就是 fitz)是性能最好的选择之一。它的渲染速度非常快,能一页一页地把 PDF 画成高分辨率的 PNG。

如果只是单纯的处理扫描版 PDF,比如要把图片上的文字识别出来并做成可搜索文本,则需要结合 OCR 库,比如 PaddleOCR 或 Tesseract。

很多同学一上来就学了一堆 PDF 库,遇到问题也不知道该用哪个,代码写着写着就越写越乱。真正的做法是用一个小小决策来统一逻辑:

  • 你要做文档结构处理(拆分、合并、加密、旋转),首选 PyPDF2/pypdf;
  • 你要做文本和表格数据抽取,首选 pdfplumber;
  • 你要做页面渲染和矢量绘图,首选 PyMuPDF。

这篇文章中,我尽量围绕最常见的操作讲:读取 PDF 信息、提取文本、拆页、合并、加密。这几个操作用 PyPDF2 系列就可以完成。而在表格提取的部分,我会引入 pdfplumber 演示。

3. 环境准备与前置条件

在正式开始编码之前,你需要确保你的 Python 环境是正常的。我推荐你使用 Python 3.8 以上版本,因为本文中使用的库在新版本 Python 上表现更稳定。如果你的电脑还没有安装 Python,建议去 Python 官网下载稳定版,安装时记得勾选“Add Python to PATH”。

然后我们需要安装以下几个库。你可以在命令行(Windows 下是 CMD 或 PowerShell,macOS/Linux 下是终端)中输入以下命令:

pip install pypdf pdfplumber

这里要说明一点:早期大家常看到的 PyPDF2 在 2022 年前后已经停止了积极维护,社区更推荐使用 pypdf 作为替代,它的 API 与 PyPDF2 基本兼容,而且修复了很多 bug。我们这里使用pypdf作为示例。当然,你机器上如果之前已经安装了 PyPDF2,很多代码同样适用,只是类名的导入路径可能会有差异,建议你在动手前先用下面的命令确认一下版本。

pip show pypdf

如果你看到类似Version: 4.x.x的输出,说明安装没有问题。

除此之外,我们或许还会用到文件路径的操作,所以一起安装标准库里的 pathlib 吗?不需要,pathlib 是 Python 3 标准自带的,直接用就行。

在开始写代码前,我们最好准备一个测试用的 PDF 文件。你可以随意创建一个 Word 文档,另存为 PDF;也可以从你手头的资料中找一个 PDF。文章里的示例文件,我统一用/tmp/sample.pdf/tmp/output作为示意,大家在实际操作时记得换成自己的真实路径。如果你是 Windows 环境,可以把这些路径改成D:\\pdf_demo\\sample.pdf这类路径。

4. 用 Python 读取 PDF 基础信息

我们先用最常遇到的需求开始:拿到一个 PDF 文件后,自动读取它的文件名、页数、作者、创建时间等基础信息。在没有使用 Python 前,你多半是打开文档,然后去属性里翻页数。现在这个操作可以变成代码里的一个函数。

下面是最小化的示例。我这里用pypdf.PdfReader来加载文件:

# 文件路径:read_pdf_info.py from pypdf import PdfReader def show_pdf_info(pdf_path): reader = PdfReader(pdf_path) pages = len(reader.pages) meta = reader.metadata print("文件路径:", pdf_path) print("PDF 页数:", pages) if meta is not None: print("标题:", meta.title) print("作者:", meta.author) print("创建者:", meta.creator) print("创建时间:", meta.creation_date) else: print("该 PDF 不包含元数据信息") if __name__ == "__main__": show_pdf_info("/tmp/sample.pdf")

这段代码背后的逻辑很简单:先用PdfReader读取文件路径,生成一个可操作的 reader 对象;然后通过len(reader.pages)获取页面总数;随后从reader.metadata中读取可选的元数据字段。

需要注意,不是所有 PDF 都有 metadata 字段,比如一些打印店生成的 PDF 可能没有作者和标题。因此代码里用if meta is not None做了个保护,避免程序报错。

运行这个脚本预期会输出类似如下内容:

文件路径: /tmp/sample.pdf PDF 页数: 12 标题: 2024年度项目报告 作者: 创建者: Microsoft Word 创建时间: 2024-01-15 10:23:45

如果出现FileNotFoundError这类报错,大概率是路径不对。如果出现PyCryptodome is required for AES encryption,说明你打开的是一个加密的 PDF,需要额外安装或输入密码,我们后文会提到。

5. 使用 Python 提取 PDF 文本与表格

接下来是 PDF 办公自动化中最核心的需求之一:提取文本。

在做数据录入、报销审核、合同关键信息抓取时,我们通常希望从 PDF 中直接把文字弄出来。如果你用 PyPDF2/pypdf 去提取文本,会发现它对纯文字型 PDF 支持尚可,但对复杂版式或表格,效果不理想。

这里我们要明白一个概念:PDF 中文字的抽取更像是一次“还原”,而不是简单的“复制”。还原的规则依赖库对内容流的解析和坐标排序。所以如果你的材料是扫描件(本质是图片),那么任何提取文本的库都无法直接产生文字,必须借助 OCR。

下面用pdfplumber提取文本。这是一个能保留坐标关系并做重组的好工具。

# 文件路径:extract_text.py import pdfplumber def extract_text_from_pdf(pdf_path, start_page=0, end_page=None): all_text = [] with pdfplumber.open(pdf_path) as pdf: total_pages = len(pdf.pages) if end_page is None: end_page = total_pages - 1 for page_index in range(start_page, min(end_page + 1, total_pages)): page = pdf.pages[page_index] text = page.extract_text() if text: all_text.append(f"----- 第 {page_index + 1} 页 -----") all_text.append(text) return "\n".join(all_text) if __name__ == "__main__": content = extract_text_from_pdf("/tmp/sample.pdf") print(content) # 可以把内容保存为 txt 文件 with open("/tmp/sample_text.txt", "w", encoding="utf-8") as f: f.write(content)

调用page.extract_text()时,如果返回None,大概率这一页是扫描图片或没有可提取的文本层。这种情况下如果你真的想拿到文字,需要走 OCR 路线。

再讲一个常见的办公场景:提取表格。很多 PDF 里的表格看似是表格,其实只是用横线和竖线画出来的图形,上面散布着文字。pdfplumber 提供了extract_tables()方法,专门处理这种带划线表格。

# 文件路径:extract_table.py import pdfplumber def extract_table_from_pdf(pdf_path, page_number=0): with pdfplumber.open(pdf_path) as pdf: page = pdf.pages[page_number] tables = page.extract_tables() for table_idx, table in enumerate(tables): print(f"发现第 {table_idx + 1} 个表格:") for row in table: print(row) if __name__ == "__main__": extract_table_from_pdf("/tmp/sample.pdf", page_number=2)

这里需要注意,extract_tables()对完整有线框的表格效果最好。如果表格没有线框,只是用空白间距排版出来的视觉表格,那很难直接抽取,需要你先用extract_text()拿到整块文本,再用正则或关键词做二次整理。所以我们在实际项目里,不要指望一个库能解决所有版式。判断版式,然后选择合适的策略,这才是工程化的思路。

6. 拆分与合并 PDF:最实用的办公脚本

讲完“读”,我们再看“重排”。拆分与合并 PDF,可能是日常办公中最高频、最节省时间的操作了。试想一下,你手头有一份 100 页的 PDF,领导只需要其中的 7 到 18 页,你要怎么发给他?如果手动操作,要用 Adobe 或 WPS 的“提取页面”,再另存为新文档。但如果每天都要拆十几份材料呢?手点太慢了。

Python 可以轻松实现按页拆分。

# 文件路径:split_pdf.py from pypdf import PdfWriter, PdfReader def split_pdf_pages(pdf_path, output_dir, page_ranges): """ :param pdf_path: 原始 PDF 路径 :param output_dir: 输出目录 :param page_ranges: 由元组组成的列表,如 [(0, 2), (3, 5)] 表示保留第 1-3 页和 4-6 页(页码索引从 0 开始) """ reader = PdfReader(pdf_path) total_pages = len(reader.pages) for idx, (start, end) in enumerate(page_ranges): writer = PdfWriter() start = max(start, 0) end = min(end, total_pages - 1) if start > end: continue for page_no in range(start, end + 1): writer.add_page(reader.pages[page_no]) output_path = f"{output_dir}/split_part_{idx + 1}.pdf" with open(output_path, "wb") as f: writer.write(f) print(f"已生成: {output_path},包含 {end - start + 1} 页") if __name__ == "__main__": split_pdf_pages("/tmp/sample.pdf", "/tmp/output", [(0, 2), (3, 5), (6, 9)])

在上面的代码中,page_ranges里的数字是从 0 开始的,比如(0, 2)表示提取第 1 页到第 3 页。很多初学者容易在这里数错页码,我建议你在实际应用前先读懂len(reader.pages)的页数含义。在实际办公中,为了更友好,你可以把 page_ranges 设计成用户直观看到的 1 到 N,然后在代码内部减 1。我上面没有做这个转换,是为了保持示例简单,真实项目里请务必做一层转换,防止用户把“第 1 页”理解成索引 1 导致定位错误。

合并 PDF 也同样简单。它的逻辑是创建统一的 PdfWriter,然后遍历多个 PdfReader 对象,把页面添加到同一个 writer 里。

# 文件路径:merge_pdf.py from pypdf import PdfReader, PdfWriter def merge_pdfs(pdf_paths, output_path): writer = PdfWriter() for pdf_path in pdf_paths: try: reader = PdfReader(pdf_path) print(f"添加文件: {pdf_path},页数: {len(reader.pages)}") for page in reader.pages: writer.add_page(page) except Exception as e: print(f"处理 {pdf_path} 失败: {e}") with open(output_path, "wb") as f: writer.write(f) print(f"合并完成: {output_path}") if __name__ == "__main__": pdf_list = ["/tmp/part1.pdf", "/tmp/part2.pdf", "/tmp/part3.pdf"] merge_pdfs(pdf_list, "/tmp/merged.pdf")

关于这个代码,有一点要提醒:PdfReader在打开加密 PDF 时,可能需要PdfReader(pdf_path, password="密码")这样传入密码,否则会抛异常。所以在拆分合并批量文件之前,建议先把来源文件的加密情况摸清,否则脚本会在运行中段崩溃。

7. 给 PDF 加密与解密

在办公场景里,加密 PDF 也很常见。你可以给一份客户合同添加打开密码,避免无关人员看到内容。用 Python 可以做到这一点,代码非常好懂。

# 文件路径:protect_pdf.py from pypdf import PdfReader, PdfWriter def encrypt_pdf(pdf_path, password, output_path): reader = PdfReader(pdf_path) writer = PdfWriter() for page in reader.pages: writer.add_page(page) # 设置打开密码,并限制打印和复制权限 writer.encrypt(user_password=password, owner_password=None, use_128bit=True, permissions_flag=0xFFFF) with open(output_path, "wb") as f: writer.write(f) print(f"加密完成: {output_path}") if __name__ == "__main__": encrypt_pdf("/tmp/sample.pdf", "your-password-123", "/tmp/encrypted.pdf")

这里permissions_flag=0xFFFF表示授予所有权限。如果你希望禁止打印,需要把 permissions_flag 设置为某个特定的位运算值。但在实际办公软件中,不同阅读器对权限位的理解未必完全一致,所以这里我建议先保持默认的授权模式。为什么?因为权限控制不解决真正的安全问题,它只是对阅读器的一个提醒。如果要真正保密,还是要用打开密码。

解密 PDF 在 pypdf 中也有对应方法,但要注意,解密操作只能针对用户密码为空的文件,如果源文件设置了打开密码而你不知道,那从原理上就不该尝试绕过,因为你没有授权。

# 文件路径:decrypt_pdf.py from pypdf import PdfReader, PdfWriter def decrypt_pdf(pdf_path, password, output_path): reader = PdfReader(pdf_path) if reader.is_encrypted: result = reader.decrypt(password) if result == 0: print("密码错误,无法解密") return writer = PdfWriter() for page in reader.pages: writer.add_page(page) with open(output_path, "wb") as f: writer.write(f) print(f"解密完成: {output_path}") if __name__ == "__main__": decrypt_pdf("/tmp/encrypted.pdf", "your-password-123", "/tmp/decrypted.pdf")

再强调一次安全边界:这里讨论的加密解密,对象必须是本人持有、或已获得合法授权的 PDF 文档。你可以在办公自动化时用它管理自己的文件,但不要打算去破解别人的加密文件。逆向处理未授权文件既无必要,也不符合正当技术规范。

8. 运行验证与效果检查

我们写好了这么多脚本,问题是怎么验证它是否正常工作。很多初学者喜欢把代码运行一把,看到没有报错就说好了,这远远不够。对于办公自动化脚本,结果文件的正确性比运行不报错重要得多。

我的建议是采用“三层验证法”。

第一层是命令行运行成功。比如你运行python merge_pdf.py,能打印出“合并完成”且没有抛异常。

第二层是文件级验证。代码执行后,除了看输出日志,还要检查生成的文件大小是否非零。如果原来合并的文件总共 10 MB,合并后的文件却只有 1 KB,那大概率是有问题的,即使脚本没有报错。

第三层是内容级验证。你可以写一个校验函数,读取生成后的 PDF 页数,并打开某一页,用extract_text()判断某个关键词是否存在。

# 文件路径:verify_pdf.py from pypdf import PdfReader import pdfplumber def verify_pdf(pdf_path, expect_pages=None, expect_keywords=None): print("开始验证:", pdf_path) reader = PdfReader(pdf_path) actual_pages = len(reader.pages) print("页数:", actual_pages) if expect_pages is not None: if actual_pages == expect_pages: print("页数校验通过") else: print(f"页数校验失败,预期 {expect_pages},实际 {actual_pages}") if expect_keywords: with pdfplumber.open(pdf_path) as pdf: text = "" for page in pdf.pages: page_text = page.extract_text() if page_text: text += page_text for keyword in expect_keywords: if keyword in text: print(f"关键词 [{keyword}] 存在") else: print(f"关键词 [{keyword}] 不存在") if __name__ == "__main__": verify_pdf("/tmp/merged.pdf", expect_pages=20, expect_keywords=["合同", "金额"])

如果验证不通过,不要急着换库或者查语法,先看一下原始 PDF 是否本身就不包含这些文字。比如扫描版 PDF 里可能写着“合同”两个字,但它是图片,不是文本层,所以提取不到。这种情况并不是代码有问题,而是数据源的问题。

实际项目里,我会把校验逻辑封装成一个函数,放在每个批处理任务的最后一步。比如批量拆分 50 个 PDF 后,统一执行校验程序,生成一份报告。这样一旦出现个别文件页数不对,可以在报告里精确知道是哪一个文件、哪一段页码范围有问题,而不是等用户发现后再追查。

9. 常见问题与排查思路

PDF 处理脚本看起来很简单,实际上在真实项目中栽跟头的人不少。我整理了下面几个高频问题,并给出排查思路。

问题现象可能原因排查方式解决方案
打开 PDF 时报错“File has not been decrypted”文档设置了打开密码用 reader.is_encrypted 判断在 PdfReader 中传入 password
提取文本时返回空或 None页面没有文本层,属于扫描件用 pdfplumber 查看该页是否含图片改用 OCR 方案
提取中文文本乱码PDF 内嵌字体映射表不规范用专业阅读器对比文本层内容改走 OCR 或以图像为准
split/merge 得到文件页数为 0页码范围写错或越界打印 len(reader.pages) 检查修正 page_range 的 start/end
合并后文件顺序不对页面添加顺序与预想不一致打印每个文件追加时的页号和文件名检查循环顺序
运行报 “PyCryptodome is required”处理加密 PDF 缺少加密库安装 pycryptodomepip install pycryptodome
pip 安装库时提示 network 超时网络连接不稳定或镜像源慢换国内 pip 镜像pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

针对最常见的情况再做一点说明。如果你处理的是中文 PDF,文本提取的第一步应该先搜一下文件有没有字体嵌入限制。很多企业内部的 PDF 会用自定义字体子集化,转出来之后文字顺序和视觉不完全一致。这时候,与其花大力气去调库的参数,我更建议沉淀一个思路:先抽一小段样本文本人工比对。绝大多数情况下,人能看得出来的规则,代码都能改出来;人看不出来的规则,就不要硬调了。

还有一点比较重要:当你在 Python 中使用 pypdf 创建出来的 PDF 或加密文件,有极低概率在某些老版本阅读器中打开时提示错误。这时先不要怀疑代码逻辑,可以试试把输出的 PDF 再重新复制一个版本,或用 WPS/Adobe 打开一次。哪一步会导致兼容性问题,再针对性地调整参数。办公自动化的目标是解决问题,不是要写出多漂亮的代码,所以保持“输出兼容性优先”的思路更有利于产出。

10. 最佳实践与工程建议

如果你打算把这些脚本放到日常脚本库中,长期使用,下面几条工程建议可以帮你省下不少力气。

第一,统一封装路径与输出规范。不要在每个脚本里硬编码文件路径,而是通过一个config.py集中管理输入目录、输出目录和临时目录。这样即使换了电脑或文件目录,只需要改一个配置文件,不需要把代码翻个底朝天。

# 文件路径:config.py from pathlib import Path BASE_DIR = Path(__file__).parent INPUT_DIR = BASE_DIR / "input" OUTPUT_DIR = BASE_DIR / "output" TEMP_DIR = BASE_DIR / "temp" # 这些目录如果不存在则自动创建 for d in [INPUT_DIR, OUTPUT_DIR, TEMP_DIR]: d.mkdir(parents=True, exist_ok=True)

第二,注意敏感文件的最小留存。PDF 里常常有身份证复印件、合同盖章、财务信息。你处理的中间文件,比如提取出的 txt、拆分后的临时 PDF,在任务结束后要及时清理。如果你把代码放到服务器上自动跑,不要忘了定期清理临时目录。

第三,适当地记录执行日志。不要只在屏幕上 print,最好同时输出到日志文件。尤其当你要批量处理几百份 PDF 时,中途任何一个文件报错,都需要事后可以回溯。

# 文件路径:logger.py import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", handlers=[ logging.FileHandler("pdf_automation.log", encoding="utf-8"), logging.StreamHandler() ] ) logger = logging.getLogger("pdf_tool")

第四,把 PDF 处理的常用函数建一个自己的工具包。比如pdf_utils.py文件里封装extract_textsplit_pdfmerge_pdfencrypt_pdf,其他调度脚本通过 import 复用。不要在多个脚本里重复复制粘贴同一段逻辑。你只需要保证封装粒度适中,不要依赖固定的“主流程”,因为不同任务组合会很不一样。

第五,在处理大批量任务前一定要做抽样测试。建议在一个小的测试集上尝试完再批量执行,避免整个文件夹一次性跑挂,造成文件损坏或输出结果不对。

最后想说的一点是:尽量把 PDF 处理和 Excel、Word 处理串联起来。很多办公自动化任务并不是孤立的。比如你可能从一个 PDF 合同里提取文本,再把关键字段写入 Excel 表;也可能先批量合并 PDF,再通过邮件或企业微信机器人发送。学会用 Python 把这些环节串起来,你的自动化网络才会真正成型,效率也会几倍地上升。PDF 处理将成为这整条流水线上坚实的一环。

11. 总结与实践建议

这篇文章从办公自动化的视角,把 PDF 的基础概念、读取信息、文本提取、表格抽取、拆分合并、加解密以及验证方法串成了一整条操作链。你可以照着这些代码去搭一套本地 Python 小工具,解决日常“手动点开 PDF 一点点操作”的低效痛点。

我们列出的代码都是可以跑的总起点,但我强烈建议你从第一个脚本开始,亲手动一动。先拿一个简单的 PDF 测试,输入和输出只要换一换路径,跑通了再扩展。之后再进入一个更复杂的场景,比如每月从几十份 PDF 报告中汇总客户出账金额,这时候你再把提取好的数据接入 Excel 处理流程,你就能体会到所谓办公自动化是什么感觉了。

真正让你进步的不是收藏这份代码,而是你用这串代码跑通了自己手头的一个麻烦。要想进一步学习,你可以考虑研究三个方面:PDF 的内部结构与页对象,或者学习 pdfplumber 的表格解析原理,又或者涉猎 OCR 技术将扫描型 PDF 转换为可检索文档。如果这篇文章对你有帮助,建议收藏备用。后续我还会沿着办公自动化这条线写更多 Python 实操教程,期待你一起把手里重复、枯燥的文件工作变成几分钟跑完的脚本。

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

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

立即咨询