文章目录
朋友们!今天咱们来聊聊一个看似普通但**绝对暗藏玄机**的工具——PyPDF2。这玩意儿在Python圈子里存在感可能不如Pandas那么强(毕竟不是天天都要折腾PDF对吧?),但关键时刻它真能救命啊!!!(特别是当你面对一堆扫描件合同或者电子报告的时候...)
## 🔍 先来个灵魂拷问:PyPDF2能干啥?
简单粗暴地说:**读取PDF内容、拆分合并页面、加解密文件、提取文本图片**... 甚至还能给PDF加书签!(没想到吧?)而且最爽的是——纯Python实现!**零外部依赖**!!!(不用装Java或者别的鬼东西,pip install PyPDF2就搞定)
---
## 🚀 基础操作三连击(打工人必看!)
### 1. 读取PDF内容 - 入门中的入门
```python
import PyPDF2
# 注意!一定要用二进制模式打开('rb')!!!
with open('神秘合同.pdf', 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
# 获取总页数(超实用!)
total_pages = len(pdf_reader.pages)
print(f"总页数:{total_pages} (别被坑了!)")
# 提取第一页文本
first_page = pdf_reader.pages[0]
text = first_page.extract_text()
print(text[:100]) # 防止打印一屏幕
⚠️ 坑点预警:extract_text()
提取的文本可能有乱码!(尤其是扫描版PDF)这时候需要祭出OCR大法了(比如PyMuPDF)
2. 合并PDF - 周报救星!!!
谁还没遇到过领导凌晨12点说"把这三个报告合成一个"???(窒息操作)
merger = PyPDF2.PdfMerger()
pdf_list = ['周报1.pdf', '周报2.pdf', '周报3.pdf']
for pdf in pdf_list:
merger.append(pdf)
# 输出合并后的文件(建议加时间戳防覆盖)
import datetime
output_name = f"合并报告_{datetime.datetime.now().strftime('%Y%m%d')}.pdf"
merger.write(output_name)
merger.close()
print(f"✅ 合并完成!文件名:{output_name}")
👉 冷知识:用merger.merge(position, '插入文件.pdf')
可以精准插入页面!比如在第5页后面塞新内容~
3. 拆分PDF - 按需取货
只要特定几页?安排!
pdf_reader = PyPDF2.PdfReader('超厚手册.pdf')
pdf_writer = PyPDF2.PdfWriter()
# 比如只要第3页和第7-9页(页码从0开始!)
target_pages = [2, 6, 7, 8]
for page_num in target_pages:
page = pdf_reader.pages[page_num]
pdf_writer.add_page(page)
with open('精华版.pdf', 'wb') as output_file:
pdf_writer.write(output_file)
💡 高频需求:按每页拆分成独立文件?加个循环就搞定!(文件名用page_{i}.pdf美滋滋)
🧠 进阶技巧:这些操作太骚了!
▫️ 给PDF加密码(保护隐私!)
pdf_writer = PyPDF2.PdfWriter()
pdf_writer.append('绝密文件.pdf')
# 设置密码(区分所有者密码和用户密码)
pdf_writer.encrypt(user_password="123456", owner_password="superadmin")
with open('加密版.pdf', 'wb') as f:
pdf_writer.write(f)
📢 重要提醒:PyPDF2用的是AES-128加密,普通防护够用了(但别指望防黑客!)
▫️ 旋转页面 - 拯救扫描歪了的文件!
pdf_reader = PyPDF2.PdfReader('歪脖子合同.pdf')
pdf_writer = PyPDF2.PdfWriter()
for page in pdf_reader.pages:
# 顺时针旋转90度(90的倍数才行!)
page.rotate(90)
pdf_writer.add_page(page)
with open('摆正了.pdf', 'wb') as f:
pdf_writer.write(f)
⚠️ 坑点:旋转操作是永久性的!建议先备份原文件!!!
▫️ 添加书签/目录(学术党狂喜)
with open('论文合集.pdf', 'rb') as f:
pdf_reader = PyPDF2.PdfReader(f)
pdf_writer = PyPDF2.PdfWriter(pdf_reader)
# 在首页(第0页)添加书签
pdf_writer.add_outline_item(title="第一章", page_number=0)
# 添加子书签(跳转到第5页)
parent = pdf_writer.add_outline_item("实验数据", page_number=4)
pdf_writer.add_outline_item("数据表1", page_number=4, parent=parent)
with open('带目录版.pdf', 'wb') as f_out:
pdf_writer.write(f_out)
🎉 从此告别"翻半天找不到图表在哪页"的噩梦!
💣 终极避坑指南(血泪经验!)
-
大文件杀手:PyPDF2处理超大型PDF(100+页)时内存占用爆炸!解决方案→试试
PdfMerger
的append
方法或换用PyMuPDF
(性能怪兽) -
文本提取玄学:遇到提取乱码?大概率是PDF内嵌字体问题。终极方案→
text = page.extract_text(extraction_mode="layout") # 或者祭出PDFMiner库(更底层但复杂)
-
版本兼容地狱:PyPDF2有两个主流版本→
PyPDF2
(维护中)PyPDF4
(但实际底层还是PyPDF2 😅)
强烈建议:坚持用
import PyPDF2
!别碰PyPDF3/PyPDF4(别问我是怎么知道的…) -
无法编辑已有内容:想改PDF里的文字?抱歉这货做不到!(需要Adobe Acrobat DC这类专业工具)
🔮 什么时候该换工具?
虽然PyPDF2很香,但遇到这些场景请果断换枪👇:
- 需要OCR识别文字 →
PyMuPDF
+Tesseract
- 转换Word/Excel → 专业付费工具更靠谱(比如
Aspose
) - 高频批量处理 → 考虑
pdfplumber
(解析表格神器!)
🌟 最后说点大实话
PyPDF2就像瑞士军刀里的小镊子——不是天天用,但需要时找不到真抓狂!(尤其是行政/法务/学术场景)它的API设计其实有点老旧了,但架不住简单暴力够直接啊!!!
下次遇到PDF需求,别急着找在线转换网站(有泄露风险❗️),先打开Python试试PyPDF2吧~(你会回来谢我的)
彩蛋:你知道用
page.mediabox
还能获取页面尺寸吗?做打印适配时超有用!(但又是另一个故事了…)