page contents

PyPDF2 库,用于在 Python 中处理 PDF 文件!

说实话,我最早接触 PyPDF2 不是因为要写什么自动化脚本,而是有一次加班,领导发来十几个合同的 PDF,让我从里面把客户名和合同号抠出来。我一开始手动一个个打开复制,做到第三个文件整个人都麻了。后来我想,Python 不是万能的吗?查了下,还真有个专门处理 PDF 的库——PyPDF2。

attachments-2025-11-iP9QprfX6912945eddac8.png说实话,我最早接触 PyPDF2 不是因为要写什么自动化脚本,而是有一次加班,领导发来十几个合同的 PDF,让我从里面把客户名和合同号抠出来。我一开始手动一个个打开复制,做到第三个文件整个人都麻了。后来我想,Python 不是万能的吗?查了下,还真有个专门处理 PDF 的库——PyPDF2。

先来点简单的,怎么读 PDF

用 PyPDF2 读 PDF 真不复杂。你只要记住它的主角是 PdfReader,然后你可以像访问数组一样去拿页面。比如下面这样:

from PyPDF2 import PdfReader

reader = PdfReader("contract.pdf")

print("总页数:", len(reader.pages))

first_page = reader.pages[0]

print(first_page.extract_text())

它的 extract_text() 就是用来提取文字的,不过这里要提醒一句——并不是所有 PDF 都能完美提取。有些 PDF 其实是图片格式的文本(比如扫描件),PyPDF2 就爱莫能助了,那种要用 OCR 库(比如 pytesseract)。我那次提合同号的时候就遇到这种情况,提出来一堆乱码。后来发现那几份是扫描件,我只好用别的库配合处理。

合并多个 PDF?一句话搞定

这功能特别常用,比如你要把几份报告、发票合成一个文件发给别人。

PyPDF2 的 PdfMerger 可以轻松搞定:

from PyPDF2 import PdfMerger

merger = PdfMerger()

merger.append("page1.pdf")

merger.append("page2.pdf")

merger.append("page3.pdf")

merger.write("merged.pdf")

merger.close()

甚至你可以用通配符动态添加多个文件,配合 glob 模块一起用,非常方便:

import glob

from PyPDF2 import PdfMerger

merger = PdfMerger()

for pdf in glob.glob("reports/*.pdf"):

    merger.append(pdf)

merger.write("all_reports.pdf")

merger.close()

我当时就是这么把十几份合同一口气合成一个文件,爽到飞起。

拆分 PDF 也很实用

有时候正好反过来,比如你只想把一个 100 页的文档拆成几页单独保存。用 PyPDF2 的 PdfWriter 就行:

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("big_report.pdf")

writer = PdfWriter()

for i in range(5, 10):  # 取第6到第10页

    writer.add_page(reader.pages[i])

with open("part.pdf", "wb") as f:

    writer.write(f)

其实它的底层逻辑挺简单,就是按页复制。你也可以用它来做更细的操作,比如把每一页另存为单独的文件。

加密和解密 PDF

有些公司文件传来都是加密的,不输入密码就打不开。PyPDF2 也能帮你处理,不过得注意——它不能暴力破解密码,只能在你知道密码的情况下操作。

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("secret.pdf")

reader.decrypt("123456")

writer = PdfWriter()

for page in reader.pages:

    writer.add_page(page)


with open("unlocked.pdf", "wb") as f:

    writer.write(f)

当然,它也可以帮你给文件加密:

from PyPDF2 import PdfWriter


writer = PdfWriter()

writer.add_blank_page(width=200, height=300)

writer.encrypt("mypassword")


with open("protected.pdf", "wb") as f:

    writer.write(f)

这种加密在传输合同或机密文件时还是挺有用的。

提取元信息,比如标题和作者

有些 PDF 文件带有元信息(metadata),比如谁创建的、标题是什么、用什么软件导出的。PyPDF2 也能直接读:

reader = PdfReader("document.pdf")

info = reader.metadata

print(info.title)

print(info.author)

我有次统计内部报告来源,光靠这玩意就把谁用 Word 谁用 WPS 一目了然。

一点小坑

要注意几个常见的坑:

非文本 PDF(比如扫描件)提取不了文字;

复杂排版的 PDF(多栏、表格)提取文字会乱;

PyPDF2 目前不支持修改已有 PDF,只能读、拆、合、加密;

如果文件太大或太多,合并时容易卡,建议分批处理。

其实 PyPDF2 算是入门级的 PDF 工具,功能够用但不算最强。如果要更复杂的,比如编辑内容、添加水印、生成表单,可以看看 reportlab 或 pdfplumber。但说句实话,能用 PyPDF2 自动处理重复性 PDF 工作,就已经能帮你省不少时间了。我后来每次碰到要整理一堆文件的任务,都先想一遍——这玩意能不能用 Python 搞定?通常答案是:能。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1507 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1507 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章