
pypdf 实践指南PDF 合并、拆分、提取与加密的完整操作【免费下载链接】pypdfA pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files项目地址: https://gitcode.com/GitHub_Trending/py/pypdfpypdf 是一个纯 Python 的 PDF 处理库帮你完成合并、拆分、旋转缩放、文本与元数据提取、加密授权这类文档流水线任务。整套 API 围绕PdfReader和PdfWriter展开本指南按任务拆解每段代码可直接运行。 定位速览能力一句话说明典型 API合并 / 拆分按整文件或页码切片重组保留原始版面writer.append(path)文本提取按页读出文本支持版面重建模式page.extract_text(layout_modeTrue)页面变换旋转、缩放、平移、叠加水印页page.add_transformation(...)加密与权限RC4 到 AES-256 算法权限按位控制writer.encrypt(...)它适合做批处理脚本和文档流水线读、改、重组都很顺手。它不做 PDF 渲染成图片也不需要像素级版面重建这类需求请找专业渲染库。⚡ 快速上手安装命令pip install pypdf pip install pypdf[crypto] # 需要 AES-256 等加密算法时再加最小可运行示例先确认库能读懂你的文件from pypdf import PdfReader reader PdfReader(input.pdf) print(len(reader.pages)) # 页数 print(reader.metadata.get(/Title, 无)) # 元数据标题 print(reader.pages[0].extract_text()[:80]) # 首页前 80 个字符运行后能在终端看到页数、标题和一段文本说明环境就绪。也可以用python -c import pypdf; print(pypdf.__version__)检查版本。 核心能力按任务拆解把多个 PDF 合并成一个最常见的需求按顺序拼接多份文件。writer.append()直接接收路径或PdfReader会保持源文件的页序、页面尺寸和旋转角。from pypdf import PdfWriter writer PdfWriter() for path in (q1.pdf, q2.pdf, annual.pdf): writer.append(path) # 整文件追加页序不变 with open(merged.pdf, wb) as f: writer.write(f)如果只要部分页面改用writer.add_page(reader.pages[i])逐页挑取即可。运行后merged.pdf的页数等于三份输入之和顺序与列表一致。图 1合并前后页面效果对比原始版面保持不变按页数把大 PDF 拆分处理超大文档时常要切成小份比如按 20 页一包归档。from pypdf import PdfReader, PdfWriter reader PdfReader(large.pdf) size 20 # 每份 20 页按你的归档规则调整 for start in range(0, len(reader.pages), size): writer PdfWriter() for page in reader.pages[start:start size]: writer.add_page(page) with open(fpart_{start // size 1:02d}.pdf, wb) as f: writer.write(f)关键点reader必须保留到所有write完成因为页面对象还引用着它的对象表。95 页的输入会生成part_01.pdf到part_05.pdf最后一份 15 页。从 PDF 中逐页提取文本from pypdf import PdfReader reader PdfReader(report.pdf) for i, page in enumerate(reader.pages): text page.extract_text() with open(fpage_{i}.txt, w, encodingutf-8) as f: f.write(text)参数说明默认模式按阅读顺序启发式排序单栏文档效果最好。双栏、混排表格会乱序这时改用page.extract_text(layout_modeTrue)重建版面网格它的char_margin/word_margin默认都是 0.5控制断行与分词阈值字距紧的文档可以适当调小。旋转、缩放并叠加水印页from pypdf import PdfReader, PdfWriter, Transformation reader PdfReader(photo.pdf) page reader.pages[0] # 变换按从左到右的顺序应用顺序不同结果不同 page.add_transformation(Transformation().rotate(90).scale(0.5)) # 需要水印时把印章页直接叠到内容页上 stamp PdfReader(stamp.pdf).pages[0] page.merge_page(stamp) writer PdfWriter() writer.add_page(page) with open(out.pdf, wb) as f: writer.write(f)参数说明rotate(90)会真正重绘内容区别于page.rotate(90)只修改页面的/Rotate属性必须是 90 的倍数。scale(0.5)表示缩到一半两个参数取值相同时内容不会变形。图 2原始页面、内容缩放与页面缩放三种效果的差异图 3把印章页叠加到正文页上的水印效果加密 PDF 并限制权限from pypdf import PdfWriter from pypdf.constants import UserAccessPermissions writer PdfWriter() writer.append(draft.pdf) writer.encrypt( user_passwordopen123, owner_passwordadmin123, algorithmAES-256-R5, permissions_flagUserAccessPermissions.PRINT | UserAccessPermissions.EXTRACT, ) with open(locked.pdf, wb) as f: writer.write(f)参数说明user_password是打开文件的密码owner_password可绕过全部限制两者不同时应分发给不同角色。algorithm缺省为 RC4-128取值还能写RC4-40、AES-128、AES-256-R5。permissions_flag按位组合置 1 表示允许上面写法即可打印、可复制文本、不可修改。 端到端实战把上面三个能力串起来合并三份季度报告为每份生成大纲入口再整体加密。from pypdf import PdfReader, PdfWriter files { 第一季度: q1.pdf, 第二季度: q2.pdf, 年度总结: annual.pdf, } writer PdfWriter() for title, path in files.items(): writer.add_outline_item(title, len(writer.pages)) # 页码从 0 计 writer.append(path) writer.add_metadata({title: 年度汇编, author: ops}) writer.encrypt(user123, admin123, algorithmAES-256-R5) with open(annual_report.pdf, wb) as f: writer.write(f) print(总页数:, len(writer.pages))len(writer.pages)作为大纲页码的技巧追加每份文件前先记录当前页数天然得到该部分的第一页位置不用手动算偏移。运行输出类似总页数: 87打开annual_report.pdf时左侧目录有三个条目分别跳到对应章节且输入user123才能打开。图 4生成的多级大纲在 PDF 阅读器中的展示⚠️ 避坑指南WrongPasswordError打开文件直接报错→ 文件本身带加密而你没有传密码。 → 用PdfReader(path, password...)打开密码错误或缺失都会走到这个异常。PdfReadError: Not an encrypted file→ 给一个未加密文件传了password参数。 → 去掉password。pypdf 对加密文件没给密码和明文文件给了密码分别报错方向正好相反。NotImplementedError: Encrypting incremental PDF files is currently not supported→ 调用encrypt时 writer 处于增量写入模式incrementalTrue。 → 加密场景改用完整写入删掉incremental相关设置。合并后写出的文件打开缺页或损坏→writer.add_page(page)持有的是源 reader 对象表里的间接引用reader 提前被回收就会出问题。 → 让reader变量存活到write()之后或改用writer.append(path)由 pypdf 自己管理生命周期。提取出的文本是乱码或空串→ 源文件的字体缺少 ToUnicode 映射pypdf 拿不到编码表无法还原字符。 → 这是源文件问题换库也基本救不回只能回到原始导出工具重新生成 PDF或改用 OCR 方案。 进阶要点内存PdfReader无论传路径还是文件对象都会把整个文件读进内存几百 MB 的文件要预留约等量的峰值内存批处理时一份 reader 处理完就释放。加密性能不装pypdf[crypto]时走纯 Python 回退实现功能可用但大文件明显慢生产环境建议装cryptography。容错strict默认False对 xref 损坏的文件能尽力恢复排查文件结构问题时传strictTrue报错信息更具体。资源清单项目说明README.md官方文档源docs/页面变换实现pypdf/_page.py工作流测试tests/test_workflows.py加密测试tests/test_encryption.py性能基准tests/bench.py把上面的任务片段存成自己的工具脚本遇到新需求时先查对应模块的源码基本就能覆盖绝大多数 PDF 批处理场景。【免费下载链接】pypdfA pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files项目地址: https://gitcode.com/GitHub_Trending/py/pypdf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考