PyPDF2 库,用于在 Python 中处理 PDF 文件
说实话,我最早接触 PyPDF2 不是因为要写什么自动化脚本,而是有一次加班,领导发来十几个合同的 PDF,让我从里面把客户名和合同号抠出来。我一开始手动一个个打开复制,做到第三个文件整个人都麻了。后来我想,Python 不是万能的吗?查了下,还真有个专门处理 PDF 的库——PyPDF2。
先来点简单的,怎么读 PDF
用 PyPDF2 读 PDF 真不复杂。你只要记住它的主角是 PdfReader,然后你可以像访问数组一样去拿页面。比如下面这样:
from PyPDF2 import PdfReaderreader = 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 PdfMergermerger = 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 PdfMergermerger = 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, PdfWriterreader = 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, PdfWriterreader = 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 PdfWriterwriter = 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 搞定?通常答案是:能。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领