尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

pypdf 实战:3 个高频 PDF 处理操作一次讲透

发布时间:2026/9/17 21:04:43

资讯中心
01
ARTICLE

pypdf 实战:3 个高频 PDF 处理操作一次讲透

pypdf 实战:3 个高频 PDF 处理操作一次讲透
pypdf 实战3 个高频 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周五下午运营丢来 200 份合同 PDF合并成一个、每份拆出前 3 页给法务、再把文本抽出来供检索。手工干到半夜也干不完。pypdf 是一个纯 Python 的 PDF 处理库拆分、合并、裁剪、页面变换、加密解密、文本提取都在同一套 API 里pip 装完就能跑。本文用可直接运行的代码讲透文本提取、合并拆分、加密权限这 3 个高频操作外加生产里真实的坑。⚡ 快速上手30 秒装好并验证要求 Python 3.9核心功能零依赖。加密能力走 cryptography 后端所以装[crypto]extra 而不是裸装还要图像处理、RTL 文字的话直接上[full]省心。下面这段装完顺手验证版本30 秒内确认环境就绪# 加密场景需要 [crypto] 后端纯读写裸装 pypdf 也够 pip install pypdf[crypto] # 验证打印出 5.x.y 之类的版本号即环境 OK python -c import pypdf; print(pypdf.__version__) # 还需要图像 / 右起文字支持时改装全家桶 # pip install pypdf[full] 能力速览什么任务用哪个方法pypdf 的 API 面不大记住下表这 6 个入口90% 的日常任务都有着落功能一句话说明关键 APIPDF 文本提取逐页抽文本layout 模式还原多列与表格排版page.extract_text(extraction_modelayout)PDF 合并拆分整文件批量导入页面或按页切片输出writer.append_pages_from_reader(reader)PDF 加密解密AES-256 加密、细粒度权限位、带密码读回writer.encrypt(user_password, ...)页面变换旋转、缩放、裁剪叠合另一页可做水印page.add_transformation(op)PDF 元数据读写 Title、Author、XMP 等文档信息writer.add_metadata({...})大纲书签多级书签导航配合跳转定位writer.add_outline_item(title, n) 三个高频场景深拆三个场景按出现频率排序先文本提取再合并拆分最后加密权限。每个场景固定四步为什么需要、为什么选这个 API、能直接跑的代码、调参要点。PDF 文本提取用 layout 模式还原多列排版业务问题运营周报是两栏排版抽出来的文本左右栏串行没法直接贴进工单系统。API 选择理由默认的 plain 模式按内容流顺序输出单栏文档没问题但多栏会被压成单行串字extraction_modelayout会按字符坐标重建阅读顺序所以两栏报表、表格密集的页面才开它。下面这段代码对同一个文件跑两种模式并各存一份方便你直接肉眼对比差异# 从报表 PDF 抽全文plain 与 layout 两种模式各输出一份便于对比 from pathlib import Path from pypdf import PdfReader reader PdfReader(report.pdf) if not reader.pages: raise SystemExit(PDF 没有任何页面检查文件是否损坏) out Path(output) out.mkdir(exist_okTrue) plain, layout [], [] for idx, page in enumerate(reader.pages, start1): # plain 模式按内容流顺序输出多栏文本会串行 plain.append(f--- 第 {idx} 页 ---\n{page.extract_text()}) # layout 模式按字符坐标重建阅读顺序适合多栏 / 表格页 layout.append(f--- 第 {idx} 页 ---\n{page.extract_text(extraction_modelayout)}) (out / plain.txt).write_text(\n.join(plain), encodingutf-8) (out / layout.txt).write_text(\n.join(layout), encodingutf-8) print(f完成共 {len(reader.pages)} 页对比 output/plain.txt 与 output/layout.txt) print(layout 模式首 100 字, layout[0][:100])调参要点layout 模式下orientations、space_width和 visitor 系列参数全部被忽略源码里明确标注别在上面花时间。layout 只重排矢量文字扫描件依旧抽空先用 OCR 补文字层再抽。源文件若是单栏普通文档plain 更快也更准layout 只留给多栏与表格场景。PDF 合并拆分200 份文件合并、按页数切片业务问题200 份合同要合成一个归档文件法务那边又要求按每 20 页切包分发。API 选择理由合并用append_pages_from_reader而不是循环add_page——它一次导入整个文件内部自行处理跨文件对象引用拆分则必须逐页add_page因为只想要页区间切片语义更直白。先写合并。目录里的 PDF 按文件名排序后依次导入顺序稳定可复现# 把 contracts/ 目录下所有 PDF 按文件名顺序合并成一个归档文件 import glob from pypdf import PdfReader, PdfWriter files sorted(glob.glob(contracts/*.pdf)) writer PdfWriter() for path in files: reader PdfReader(path) # 整文件按原始页序批量导入比循环 add_page 简洁且不易漏页 writer.append_pages_from_reader(reader) with open(merged.pdf, wb) as f: writer.write(f) print(f完成{len(files)} 份合同已合并为 merged.pdf)再写拆分。注意reader.pages支持切片start : start per取出的就是当前这一批# 把大 PDF 按每 20 页切成若干小文件文件名带序号 from pypdf import PdfReader, PdfWriter reader PdfReader(large.pdf) total len(reader.pages) per 20 # 每个小文件包含的页数 batch 0 for start in range(0, total, per): batch 1 writer PdfWriter() # 只导入本页区间pages 切片返回的是 PageObject 列表 for page in reader.pages[start : start per]: writer.add_page(page) with open(fsplit_{batch:02d}.pdf, wb) as f: writer.write(f) print(f完成{total} 页拆为 {batch} 个文件)图plain 合并后原始页面排版保持不变调参要点混合不同页面尺寸的文档时pypdf 不会强制缩放每页保留自己的 MediaBox要统一输出就先对页面做Transformation().scale()变换。writer.write()必须以二进制wb模式打开文本模式会丢数据。拆分文件多时注意每批新建PdfWriter()不要复用同一个 writer否则后面的write会把前面的页再写一遍。PDF 加密解密AES-256 与权限位怎么配业务问题财务底稿发给外部审计要求只能打开和打印不许改内容、不许复制文本。API 选择理由encrypt()的user_password是第一个位置参数决定打开文件的密码不传owner_password时默认与之一致。算法默认 RC4-128要 AES-256 必须显式传algorithmAES-256加密实现可参考pypdf/_crypt_providers/。先加密权限位只勾打印 提取其余操作自动被禁# 加密文档AES-256 只允许打印与提取文本其余权限全部收回 from pathlib import Path from pypdf import PdfReader, PdfWriter from pypdf.constants import UserAccessPermissions reader PdfReader(report.pdf) writer PdfWriter() # 页面必须先入 writerencrypt() 作用在已写入的对象上 for page in reader.pages: writer.add_page(page) # 权限位语义是1 授予这里只授予打印和提取两项 writer.encrypt( user123, owner_passwordadmin123, algorithmAES-256, permissions_flagUserAccessPermissions.PRINT | UserAccessPermissions.EXTRACT, ) out Path(encrypted.pdf) with open(out, wb) as f: writer.write(f) print(f完成{out}打开密码 user123仅允许打印与提取)再验证读回密码在构造PdfReader时就传入错了会抛WrongPasswordError批量场景必须接住# 读回加密文件密码在构造时传入密码错误时给出可读提示 from pypdf import PdfReader from pypdf.errors import WrongPasswordError path encrypted.pdf try: reader PdfReader(path, passworduser123) except WrongPasswordError: # 用户密码不对或为空仅有 owner 密码的文件要传 owner 密码 reader PdfReader(path, passwordadmin123) for i, page in enumerate(reader.pages, 1): print(f第 {i} 页文本长度{len(page.extract_text())}) print(元数据标题, reader.metadata.get(/Title, (无)))调参要点权限位是1 即授予把想允许的操作 OR 起来即可什么都不传等于全部放开。AES-256 依赖[crypto]后端没装 cryptography 会在加密时抛DependencyError。encrypt()之后直接write()增量写入incremental下加密不受支持会抛NotImplementedError。 踩坑与调优生产里真实翻车的 4 次现象加密文件一构造 reader 就报FileNotDecryptedError。根因文件设了用户密码而没传或传错这就是最常见的空密码坑。解法构造时PdfReader(path, password...)只有 owner 密码的文件要传 owner 密码批量脚本里捕获WrongPasswordError把文件名报清楚。图PyPdfError 异常树便于精确捕获现象layout 模式输出是空的。根因页面是扫描图没有文字层layout 只重排矢量文字读不了像素。解法先用 OCR如 tesseract产出带文字层的 PDF 再抽plain 模式抽查也空即可确认无文字层。现象合并 200 个文件内存一路涨。根因所有 reader 存进了列表writer 引用着它们的页面对象谁都回收不掉。解法逐个导入每读完一个立刻del reader并gc.collect()骨架见下。现象encrypt权限位看起来反了。根因位值 1 的语义是授予传哪个标志就是放开哪个不是禁止。解法只 OR 想允许的操作要只读文档就单独传UserAccessPermissions.EXTRACT。下面这段是批量处理的内存骨架分块导入、即读即释放全程只驻留当前文件# 合并 200 份合同 PDF逐个导入、逐个释放内存不再随文件数上涨 import gc import glob from pypdf import PdfReader, PdfWriter writer PdfWriter() for path in sorted(glob.glob(contracts/*.pdf)): reader PdfReader(path) # 只驻留当前文件 writer.append_pages_from_reader(reader) # 导入该文件全部页面 del reader # 读下一个前释放引用 gc.collect() # 归还上一轮内存 writer.write(merged.pdf) 下一步三个操作跑通后可以往这几个方向接把文本提取接进 CI 发布流水线每次版本发布重新抽取规格 PDF与上一版做文本 diff抓出未经评审的措辞变更。批量回写 PDF 元数据给合并后的合同用add_metadata写入合同编号与部门让文件管理器按字段检索而不是靠文件名。进阶项目——合同评审包生成器合并拆分 AES-256 受限权限 add_outline_item大纲书签一个脚本出完整交付包。【免费下载链接】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),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。