给纯小白的Python操作 PDF 笔记
一、文件基础
-
打开与关闭
- 推荐用
with open(path, mode, encoding='utf-8') as f:
,自动完成close()
,避免泄露文件句柄。 - 常见模式:
'r'
读,'w'
写覆盖,'a'
追加,'rb'
/'wb'
二进制。 - Windows 默认编码为 GBK,Linux/Mac 为 UTF-8;跨平台脚本务必显式指定 encoding。
- 推荐用
-
文本读写
f.read()
一次读全部;f.readline()
逐行;f.readlines()
得列表。- 追加写入:
with open('test.txt','a',encoding='utf-8') as f: f.write('xxx')
。
-
路径与编码错误
- 绝对路径:
C:/Users/...
(正斜杠或双反斜杠)。 - 相对路径:以脚本所在目录为基准,可用
os.path.join()
拼接。 - 遇到
UnicodeDecodeError
时,尝试encoding='utf-8-sig'
或'gbk'
。
- 绝对路径:
二、PDF 处理(PyPDF2 + pdfplumber 组合拳)
- 环境准备
pip install PyPDF2 pdfplumber pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
- 读取文字
import pdfplumberwith pdfplumber.open('demo.pdf') as pdf:for page in pdf.pages:print(page.extract_text())
- 读取表格
all_tables = []with pdfplumber.open('demo.pdf') as pdf:for p in pdf.pages:for table in p.extract_tables():all_tables.extend([row for row in table if any(row)])df = pd.DataFrame(all_tables)df.to_excel('pdf_table.xlsx', index=False, header=False)
- 合并 PDF(PyPDF2)
from PyPDF2 import PdfMergermerger = PdfMerger()for pdf in ['1.pdf', '2.pdf']:merger.append(pdf)merger.write('merged.pdf')merger.close()
- 添加水印(注意层级顺序)
from PyPDF2 import PdfFileReader, PdfFileWriterbase = PdfFileReader('src.pdf')watermark = PdfFileReader('water.pdf').getPage(0)writer = PdfFileWriter()for i in range(base.getNumPages()):page = base.getPage(i)# 先底层内容,后水印;若水印被文字遮挡,可调整水印透明度或在生成水印 PDF 时放到底层page.mergePage(watermark) # mergePage 会把两页叠加,watermark 在上层writer.addPage(page)with open('res_watermarked.pdf', 'wb') as f:writer.write(f)
课堂踩坑:水印盖字 → 在水印 PDF 里把文字透明度降低或置底后再合并。
- Word → PDF(Windows 专用,pypiwin32)
import win32com.client as win32word = win32.Dispatch('Word.Application')doc = word.Documents.Open(r'C:\abs\path\template.docx')doc.ExportAsFixedFormat('template.pdf', 17) # 17=pdfdoc.Close(); word.Quit()
三、实战小结
- 文件操作牢记 with+encoding;PDF 处理分清 pdfplumber(读取)与 PyPDF2(编辑)。
- 合并、加水印前先用小文件调试,避免一次性加载大 PDF 导致内存爆炸。
- 路径/编码问题优先排查打印
os.getcwd()
与显式 encoding。