news 2026/9/17 8:32:25

如何用 pypdf 完成 PDF 合并、拆分与文本提取?完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 pypdf 完成 PDF 合并、拆分与文本提取?完整指南

如何用 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/pypdf

pypdf 是一个纯 Python 实现的 PDF 处理库,核心功能是合并、拆分、裁剪和变换 PDF 页面,同时支持加密解密、元数据读取和文本提取。它解决的核心问题是:不依赖 Adobe 等商业软件,用几行脚本就能批量、可重复地处理 PDF 文件。当前仓库版本为 6.18.1,基于 BSD-3-Clause 协议开源。

核心能力速览:

能力说明
合并与拆分把多个 PDF 拼成一个,或按页取出组成新文档
旋转与裁剪整页旋转 90 度倍数,调整视图框裁剪页面
文本与元数据提取按页提取文本、读取文档信息与 XMP 数据
加密与解密支持 RC4 与 AES,AES 需额外依赖
水印与印章把另一份 PDF 的页面叠加到每页之上或之下

快速开始:安装 pypdf 并运行第一个脚本

pypdf 要求 Python 3.9 及以上,核心安装只需一条命令(需要 AES 加解密时安装pip install pypdf[crypto]):

pip install pypdf

最小可运行示例(假设当前目录有一份 example.pdf,可替换为你手头的任意 PDF):

from pypdf import PdfReader reader = PdfReader("example.pdf") print("页数:", len(reader.pages)) print("首页文本:", reader.pages[0].extract_text()[:80])

成功的标志:终端先输出一行页数(如页数: 4),随后打印出首页开头约 80 个字符的文本。能打印出真实文字内容,说明安装与文本提取都正常。

核心功能详解

pypdf 提取文本:按页读取并输出

适合需要从合同、报告中批量取文本做检索或汇总的场景。

from pypdf import PdfReader reader = PdfReader("example.pdf") for i, page in enumerate(reader.pages): print(f"--- 第{i+1}页 ---") print(page.extract_text())

效果提示:extract_text()支持传入角度元组(如(0, 90))只取特定方向的文字,也支持extraction_mode="layout"尽量还原版面布局。坑点:扫描件或纯图片 PDF 没有文字层,提取结果为空,需要 OCR,pypdf 不做 OCR。

pypdf 合并 PDF:多文件拼接成一份

适合把多份周报、附件合并成单一文件,也适合从一个 PDF 中按页拆分。

from pypdf import PdfWriter writer = PdfWriter() for pdf in ["a.pdf", "b.pdf", "c.pdf"]: writer.append(pdf) # 追加整个文件 writer.append("d.pdf", pages=(0, 3)) # 只取 d.pdf 的第 0~2 页 writer.write("merged.pdf")

效果提示:append(file, pages=(start, stop))中 stop 不含,(0, 3)取前 3 页。处理页数极多的大文件时可能触发 Python 递归限制,可按 docs/user/merging-pdfs.md 的说明适当调大sys.setrecursionlimit

pypdf 旋转页面与裁剪 mediabox

适合扫描件方向错误的文档,以及只保留页面局部区域的场景。

from pypdf import PdfReader, PdfWriter reader = PdfReader("example.pdf") writer = PdfWriter() writer.add_page(reader.pages[0].rotate(90)) # 顺时针旋转 90 度 page = writer.add_page(reader.pages[1]) page.mediabox.upper_right = (page.mediabox.right / 2, page.mediabox.top / 2) # 裁剪为左上半区 writer.write("out.pdf")

效果提示:旋转优先用page.rotate(90),它会同步维护页面框坐标。坑点:裁剪只是调整视图框(viewbox),被裁掉的内容仍留在文件内部、可被恢复,并不等于真正删除内容。

进阶用法

给 PDF 加水印或印章

需求:给一批页面统一压上"草稿"水印或审批章,水印可以来自另一份单页 PDF。做法:读入印章页,对每页调用merge_pageover=False表示垫在底层做水印,over=True则盖在顶层做印章。

from pypdf import PdfReader, PdfWriter stamp = PdfReader("watermark.pdf").pages[0] writer = PdfWriter(clone_from="report.pdf") for page in writer.pages: page.merge_page(stamp, over=False) writer.write("report-watermarked.pdf")

收益:水印可先缩放旋转再合并(用merge_transformed_page配合Transformation),一份脚本即可批量处理整批文件,无需打开任何 GUI。下图为 pypdf 生成的水印叠加效果示例:

PDF 加密与解密

需求:对外发出的文档要加密码保护,收到的加密文件需要解开再处理。做法:加密时用writer.encrypt()指定密码和算法;解密前先判断reader.is_encrypted,再用reader.decrypt()输入密码。

from pypdf import PdfReader, PdfWriter writer = PdfWriter(clone_from="report.pdf") writer.encrypt("my-secret-password", algorithm="AES-256") writer.write("report-encrypted.pdf") reader = PdfReader("report-encrypted.pdf") if reader.is_encrypted: reader.decrypt("my-secret-password")

收益:AES-256 是目前推荐算法(文档同时提到AES-256-R5);注意若不传algorithm参数,pypdf 出于兼容默认走 RC4,而 RC4 已被认为不安全,正式使用请显式指定 AES。

常见问题

问:pypdf 支持哪些 Python 版本,有没有操作系统限制? 答:需要 Python 3.9 及以上(见 pyproject.toml 中requires-python = ">=3.9"),支持 3.9~3.14。库本身跨平台,无系统级限制;核心功能几乎只用标准库,仅 AES 加解密和图像提取需要额外依赖。

问:之前用的是 PyPDF2 或旧版 pypdf,升级要注意什么? 答:pypdf 3.1.0 之后 API 有显著变化(如PdfWriter接管了原PdfMerger的大部分职责),从旧版本升级建议对照 docs/meta/migration-1-to-2.md 迁移文档逐项检查。

问:读取加密 PDF 报错或提示密码失败,怎么排查? 答:先确认文件是否真的加密(检查reader.is_encrypted),再确认密码正确;若文件使用 AES 算法而你没有安装pypdf[crypto],加解密会失败,安装对应依赖即可。提交 issue 时按仓库要求附上最小可复现示例(代码 + 出问题的 PDF +print(pypdf.__version__)的版本号)。

资源导航

  • 官方文档(仓库内):docs/,按用户指南、模块参考、开发说明分目录
  • 项目说明:README.md
  • 源码入口:pypdf/,核心读写逻辑在 pypdf/_reader.py 与 pypdf/_writer.py
  • 版本记录:CHANGELOG.md

现在就试试:找一份手边的 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

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 8:30:39

SpringBoot整合Neo4j实战:图数据库应用开发指南

1. 为什么选择SpringBoot整合Neo4j?在当今数据关系日益复杂的应用场景中,传统关系型数据库在处理多对多关系时往往显得力不从心。我去年接手的一个社交网络分析项目就遇到了这个问题——当需要频繁查询"朋友的朋友"这类多层关系时,…

作者头像 李华
网站建设 2026/9/17 8:30:20

智能电梯门禁系统架构设计与实战经验分享

1. 智能电梯门禁系统架构解析作为一名参与过多个大型商业综合体梯控系统部署的工程师,我想分享一套经过实战验证的智能电梯门禁系统设计方案。这套系统采用模块化架构,完美融合了人脸识别、刷卡验证和二维码技术,特别适合高端写字楼、医院和智…

作者头像 李华
网站建设 2026/9/17 8:30:11

基于图像处理与机器学习的水浑浊度预测系统实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 8:27:25

大模型私有化部署显存优化技术与实践

1. 项目背景与核心挑战在人工智能技术快速发展的当下,大模型私有化部署面临着一个关键瓶颈——显存资源的高消耗。以当前主流的百亿参数模型为例,单次推理任务通常需要占用16GB以上的显存容量,而训练过程更是需要多块高端显卡并行工作。这种资…

作者头像 李华