十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python 中处理 PDF 的实操指南:上手 pypdf

Python 中处理 PDF 的实操指南:上手 pypdf Python 中处理 PDF 的实操指南上手 pypdf【免费下载链接】pypdfA pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files项目地址: https://gitcode.com/GitHub_Trending/py/pypdf如果你需要合并、拆分 PDF或者从文档里提取文字、给它上密码pypdf 值得试一下。这是一款纯 Python 的 PDF 处理库读文本、改页面、加元数据、加密解密都能做。本文按拿到一个文件后怎么处理它的顺序用几段能直接跑的代码带你走完最常用的场景。一、先跑起来一行命令装好 pypdfpypdf 对 Python 版本要求不高3.9 以上不需要额外的系统依赖装完就能用pip install pypdf如果你的脚本要加密或解密文档多装一个加密依赖即可pip install pypdf[crypto]。下面这行代码用来确认环境没问题import pypdf print(pypdf.__version__) # 打印当前安装的版本号能看到版本号就说明环境就绪了。二、用一份 PDF 串起三个任务假设你手上有一份invoice.pdf接下来几天要对它做三件事读出文字、和别人发的几份文档拼在一起、最后加个密码再发出去。任务1把文字从页面里读出来文本提取是最常见的诉求。pypdf 的入口是PdfReader它把整个文件读进内存之后你可以逐页访问。每一页调用extract_text()就会返回这页上的文字字符串from pypdf import PdfReader doc PdfReader(invoice.pdf) print(f共 {len(doc.pages)} 页) for i, page in enumerate(doc.pages): text page.extract_text() # 取这一页的文字 print(f第 {i 1} 页开头{text[:50]!r})默认是普通模式按内容流顺序输出文字如果你的文档是多栏排版可以试试page.extract_text(extraction_modelayout)它属于实验功能输出会更接近纸面布局但不保证完美。任务2多份拼成一份也能再拆开合并的思路很直接新建一个空的PdfWriter把每份文件的页面依次搬进去最后一次性写出。拆分反过来做——读出源文件按页码切片分别写进两个新文件from pypdf import PdfReader, PdfWriter # 合并把几份文件按顺序拼成一个 merged PdfWriter() for path in (a.pdf, b.pdf, c.pdf): for page in PdfReader(path).pages: merged.add_page(page) with open(combined.pdf, wb) as f: merged.write(f) # 拆分把长文件从中间切成两半 src PdfReader(combined.pdf) half len(src.pages) // 2 for name, part in ((first-half.pdf, src.pages[:half]), (second-half.pdf, src.pages[half:])): out PdfWriter() for page in part: out.add_page(page) with open(name, wb) as f: out.write(f)页面是原样搬移的字体、图片、注释都不会丢这也是 pypdf 这类结构化库比截图式工具可靠的地方。任务3给文档上锁并分权限pypdf 的encrypt()支持两套密码user_password是别人打开文件要输的密码owner_password是管理员密码用来解除限制。permissions_flag用位标志控制打开后允许做什么比如只许打印、不许复制文字from pypdf import PdfReader, PdfWriter from pypdf.constants import UserAccessPermissions reader PdfReader(report.pdf) writer PdfWriter() for page in reader.pages: writer.add_page(page) # 打开后只能打印不能复制文字 writer.encrypt( user_passwordopen123, owner_passwordmaster456, permissions_flagUserAccessPermissions.PRINT, ) with open(report-locked.pdf, wb) as f: writer.write(f)想反过来把锁打开用密码读进来再写出一份未加密的副本即可reader PdfReader(report-locked.pdf, passwordopen123) plain PdfWriter() for page in reader.pages: plain.add_page(page) with open(report-open.pdf, wb) as f: plain.write(f)三、让脚本敢上线容错、大文件和批量真正跑在定时任务里的脚本最怕一份坏文件把整批拖垮。PDF 读取相关的基本都继承自PdfReadError其中密码不对有专门的WrongPasswordError所以按异常类型分别处理就足够了from pypdf import PdfReader from pypdf.errors import PdfReadError, WrongPasswordError def open_safe(path): 能打开就返回 reader打不开就返回 None 而不是抛异常 try: return PdfReader(path) except WrongPasswordError: print(f{path} 需要密码) except PdfReadError as e: print(f{path} 无法解析{e}) return None批量处理时把上面这个函数放进循环里让每个文件各自兜底。处理大文件时记住两点逐页访问、用完及时释放引用del变量或让循环变量覆盖旧引用别把每页的文字全部攒在一个大列表里再处理写出结果也用with open(...)保证句柄关闭。异常结构可以参考这张图需要更细的排查时按层级往上找父类四、两处细活元数据与目录文档信息标题、作者和左侧的书签目录是体现专业感的两个小地方。元数据读起来很简单——reader.metadata是个类字典对象取title这种属性即可写则是通过add_metadata传一个键值对键要带斜杠前缀from pypdf import PdfReader, PdfWriter reader PdfReader(report.pdf) print(reader.metadata) # 看现有元数据没有会是 None writer PdfWriter() for page in reader.pages: writer.add_page(page) writer.add_metadata({/Title: 季度报告, /Author: 数据组}) # 顺手加个两级目录先建父项再传 parent 挂子项 root writer.add_outline_item(全文, 0) writer.add_outline_item(第一章, 0, parentroot) writer.add_outline_item(第二章, 5, parentroot) with open(report-polished.pdf, wb) as f: writer.write(f)add_outline_item的第二个参数是页码从 0 开始返回的目录项可以直接当子项的parent嵌套层级不受限。生成后的目录效果大致如下五、什么时候用、怎么更快pypdf 是纯 Python 实现优点是不挑环境、不引外部二进制依赖适合脚本、后端服务和教学场景如果你的任务核心是识别扫描件OCR它不负责需要搭配专门的 OCR 工具。性能上注意三点文本提取通常是最耗时的一步layout 模式更慢但更接近排版extract_text的结果不要依赖固定顺序文档不同输出顺序会变合并大量页面时先全部add_page再一次性write避免反复落盘。常见坑可以对照这张小表| 现象 | 多半的原因和处理 | | 提取文字有乱码或乱序 | 字体编码特殊试试extraction_modelayout或检查源文件 | | 加密文件读取报异常 | 传password参数密码错误会抛WrongPasswordError| | 加密功能报错 | 未装加密依赖执行pip install pypdf[crypto]| | 内存占用高 | 逐页处理并及时释放引用不要一次性囤积全部文本 |六、接下来想继续深入两条路都从仓库里找[tests/test_workflows.py](https://link.gitcode.com/i/2ca4d6edbc209bc49eeee50f9dfb9951)里有大量真实文件的完整用法照着改成自己的参数最快[docs/user/](https://link.gitcode.com/i/7ee1536e9e5788a78acd642d4c92490b)目录按场景写了合并、水印、加密等专题文档。常用模块的位置供你定位源码读取pypdf/_reader.py写入与加密pypdf/_writer.py、pypdf/_crypt_providers/页面操作pypdf/_page.py文本提取pypdf/_text_extraction/异常定义pypdf/errors.py把本文的几段代码保存下来当模板遇到新需求时先翻一下tests里有没有现成写法——pypdf 的大部分能力都能在那里找到可以运行的参考答案。【免费下载链接】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),仅供参考
返回列表