实战经验:使用 Python 的 PyPDF 进行 PDF 操作

news2025/1/21 17:04:13

在这里插入图片描述

文章目录

    • 1. 为什么选择 PyPDF?
    • 2. 安装 PyPDF
    • 3. PDF 文件的合并与拆分
      • 3.1 合并 PDF 文件
      • 3.2 拆分 PDF 文件
    • 4. 提取 PDF 文本
    • 5. 修改 PDF 元信息
    • 6. PDF 加密与解密
      • 6.1 加密 PDF
      • 6.2 解密 PDF
    • 7. 页面旋转与裁剪
      • 7.1 旋转页面
      • 7.2 裁剪页面
    • 8. 实战经验总结

PDF 是一种非常常见的文件格式,用于文档共享、电子书、合同等场景。对于开发者来说,能够高效地操作 PDF 文件是一个重要技能。本文将介绍如何使用 Python 的 PyPDF 库完成一些常见的 PDF 处理任务,并分享实战经验。

1. 为什么选择 PyPDF?

PyPDF 是一个轻量级且功能强大的 PDF 操作库,支持以下功能:

  • 合并和拆分 PDF 文件
  • 提取文本和元信息
  • 添加或修改文档的元数据
  • 加密和解密 PDF
  • 自定义 PDF 页面旋转或裁剪

以下是一些实战场景的详细实现。


2. 安装 PyPDF

首先,需要安装 PyPDF 库。可以使用 pip:

pip install pypdf

确保安装的是最新版,以获得最新功能和性能改进。


3. PDF 文件的合并与拆分

3.1 合并 PDF 文件

合并多个 PDF 文件在生成报告或整理文档时非常有用。

from pypdf import PdfMerger

# 初始化合并器
merger = PdfMerger()

# 添加需要合并的 PDF 文件
merger.append("file1.pdf")
merger.append("file2.pdf")

# 保存合并后的文件
merger.write("merged.pdf")
merger.close()
print("PDF 合并完成!")

3.2 拆分 PDF 文件

将一个 PDF 文件拆分为多个独立的页面文件。

from pypdf import PdfReader, PdfWriter

# 读取 PDF 文件
reader = PdfReader("input.pdf")

# 拆分每一页
for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    with open(f"page_{i+1}.pdf", "wb") as output_file:
        writer.write(output_file)
print("PDF 拆分完成!")

4. 提取 PDF 文本

提取 PDF 文件中的文本内容,可以用于数据分析或自动化处理。

from pypdf import PdfReader

# 读取 PDF 文件
reader = PdfReader("input.pdf")

# 提取每页的文本
for page in reader.pages:
    print(page.extract_text())

注意事项

  • 文本提取的效果取决于 PDF 的结构。如果 PDF 中的文本是以图像形式存储的,则无法直接提取文本。

5. 修改 PDF 元信息

修改 PDF 的元数据,例如标题、作者等。

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

# 复制所有页面到新 PDF
writer.add_pages(reader.pages)

# 修改元信息
writer.metadata = {
    "/Title": "新的标题",
    "/Author": "作者名",
    "/Subject": "主题描述"
}

with open("output.pdf", "wb") as output_file:
    writer.write(output_file)
print("元信息修改完成!")

6. PDF 加密与解密

6.1 加密 PDF

为 PDF 文件添加密码保护。

from pypdf import PdfWriter

writer = PdfWriter()
writer.append("input.pdf")

# 设置密码
writer.encrypt(user_password="user123", owner_password="owner123")

with open("encrypted.pdf", "wb") as output_file:
    writer.write(output_file)
print("PDF 加密完成!")

6.2 解密 PDF

解密受密码保护的 PDF 文件。

from pypdf import PdfReader

reader = PdfReader("encrypted.pdf")

# 提供密码解密
reader.decrypt("user123")

for page in reader.pages:
    print(page.extract_text())

7. 页面旋转与裁剪

7.1 旋转页面

旋转 PDF 的页面,例如将横向页面转为纵向。

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

# 旋转每一页
for page in reader.pages:
    page.rotate(90)  # 顺时针旋转 90 度
    writer.add_page(page)

with open("rotated.pdf", "wb") as output_file:
    writer.write(output_file)
print("页面旋转完成!")

7.2 裁剪页面

裁剪页面边框以去掉不必要的内容。

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

for page in reader.pages:
    # 设置裁剪框 (左, 下, 右, 上)
    page.mediabox.lower_left = (50, 50)
    page.mediabox.upper_right = (500, 700)
    writer.add_page(page)

with open("cropped.pdf", "wb") as output_file:
    writer.write(output_file)
print("页面裁剪完成!")

8. 实战经验总结

  1. 处理异常:在实际操作中,确保捕获文件读写或解析过程中的异常,例如文件不存在或解密失败。
  2. 测试 PDF 文件:由于 PDF 文件格式的多样性,在批量处理前需要先对样本文件进行测试。
  3. 性能优化:对于大文件,使用分批加载的方式处理。
  4. 安全性:避免在代码中硬编码敏感信息,例如密码。

通过本文,您应该对 PyPDF 的常用功能有了清晰的理解,并能应用到实际项目中。如果有更复杂的场景,可以参考官方文档或社区资源深入探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11的多线程

目录 引言 thread类的简单介绍 接口解读 使用范例 move的作用--将资源“夺舍” 原子性操作库(atomic) lock_guard与unique_lock 前置知识:mutex锁(类似linux下的ptrhead_mutex_t数据) mutex的种类 1. std::mutex 2. std::recursive_…

电子应用设计方案96:智能AI充电器系统设计

智能 AI 充电器系统设计 一、引言 智能 AI 充电器系统旨在为各种电子设备提供高效、安全、智能的充电解决方案,通过融合人工智能技术,实现自适应充电、优化充电效率和保护电池寿命。 二、系统概述 1. 系统目标 - 自适应识别不同设备的充电需求&#xf…

logback日志自定义占位符

前言 在大型系统运维中,很大程度上是需要依赖日志的。在java大型web工程中,一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用,比如线程号【%t】、时间【%d】、日志等级【%p】,…

Stable Diffusion 3.5 模型在 Linux 上的部署指南

文章目录 前言-参考资料如下一. ComfyUI安装二.模型下载2.1 安装GGUF和T5 xxl编码模型2.2 安装ComfyUI辅助插件2.3 启动ComfyUI2.4 基础ComfyUI和SD3.5配置2.5 demo 前言-参考资料如下 ComfyUI WIKI教程 sd3.5 github 尝试过sd集成ollama,但是sd在ollama上无法良好…

【Go】Go数据类型详解—指针

1. 前言 在我看来,一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同:int整型、float浮点型、string字符串类型、bool布尔类型,但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…

Grafana 统一可视化了,告警如何统一?

对于大部分公司,通常都不止一套监控、可观测性相关的系统,云上的、云下的,开源的、商业的,指标的、日志的、链路的,各个系统体验不同,权限难管,如何统一化并为各个团队赋能,是很多技…

LeetCode 110.平衡二叉树

题目描述 给定一个二叉树,判断它是否是平衡二叉树。 示例 1: 示例 2: 输入:root [1,2,2,3,3,null,null,4,4] 输出:false 示例 3: 输入:root [] 输出:true 提示: …

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:product.kylinos.cn 开发者专区:developer.kylinos.cn 文档中心:document.kylinos.cn 交流论坛:forum.kylinos.cn 服务器环境以及配置 【内核版本…

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试(HTTP和HTTPS) HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头(Request Headers)示例请求标头 响应标头(Response Header…

OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 为已校准的立体相机的每个头计算校正变换。 cv::stereoRectify 是 OpenCV 中用于立体校正的函数,它基于已知的相机参数和相对位置&am…

ARP 表、MAC 表、路由表、跨网段 ARP

文章目录 一、ARP 表1、PC2、路由器 - AR22203、交换机 - S57004、什么样的设备会有 ARP 表? 二、MAC 表什么样的设备会有 MAC 表? 三、路由表什么样的设备会有路由表? 四、抓取跨网段 ARP 包 所谓 “透明” 就是指不用做任何配置 一、ARP 表…

深度学习 · 手撕 DeepLearning4J ,用Java实现手写数字识别 (附UI效果展示)

引言 随着人工智能技术的不断发展,手写数字识别已经成为深度学习领域的一个经典案例。不管是老牌的机器学习模型还是现代的神经网络架构,手写数字识别总是大家学习和实战的起点之一。而对于我们日常使用的Java开发者来说,借助DeepLearning4J…

天机学堂5-XxlJobRedis

文章目录 梳理前面的实现:Feign点赞改进 day07-积分系统bitmap相关命令签到增加签到记录计算本月已连续签到的天数查询签到记录 积分表设计签到-->发送RabbitMQ消息,保存积分对应的消费者:**消费消息 用于保存积分**增加积分查询个人今日积…

2024 年度学习总结

目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题,因为一些原因,我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送,所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver,这是执行数据抓取的…

[操作系统] 进程的调度

进程切换概念 时间⽚:当代计算机都是分时操作系统,没有进程都有它合适的时间⽚(其实就是⼀个计数 器)。时间⽚到达,进程就被操作系统从CPU中剥离下来。 死循环是如何运行? 当一个进程代码为死循环,它并不会一直占据C…

Biotin sulfo-N-hydroxysuccinimide ester ;生物素磺基-N-羟基琥珀酰亚胺酯;生物素衍生物;190598-55-1

一、生物素及其衍生物的概述 生物素衍生物是指在生物素(Vitamin H或B7)分子基础上进行化学修饰得到的衍生化合物。这些衍生化合物在生物医学研究、临床诊断和药物开发等领域有着广泛的应用。 生物素(Biotin)是一种水溶性维生素&a…

Jenkins-Pipeline简述

一. 什么是Jenkins pipeline: pipeline在jenkins中是一套插件,主要功能在于,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程…

Linux系统下安装配置Nginx(保姆级教程)

目录 前言 安装配置Nginx 一.下载依赖 二.下载Nginx 1. 访问官网?,获取需要的Nginx版本 2. 将文件下载到Linux系统 3. 解压文件 4. 解压成功后,当前文件夹会出现一个nginx-1.26.1文件夹,进入到文件夹内 5. 配置nginx 6.?编译并安…

《Linux服务与安全管理》| 邮件服务器安装和配置

《Linux服务与安全管理》| 邮件服务器安装和配置 目录 《Linux服务与安全管理》| 邮件服务器安装和配置 1.在Server01上安装dns、postfix、dovecot和telnet,并启动 2.在Server01上配置DNS服务器,设置MX资源记录 3.在server1上…