当前位置: 首页 > news >正文

Python对PDF文件页面的旋转和切割

Python对PDF文件页面的旋转和切割

利用Python的.rotate()方法和.mediabox属性对PDF页面进行旋转和切割,最终生成一个PDF。下面结合案例进行说明,本示例中的名为split_and_rotate.pdf文件在practice_files文件夹中,

示例(1):

在home目录中创建一个新的PDF,命名为rotated.pdf。将split_and_rotate.pdf中的所有页面逆时针旋转90度后保存到该文件中。原始文件如下:

截屏2024-10-09 19.17.13

下面将以上的PDF文件逆时针旋转90度后保存。

源代码如下:

from pathlib import Path
from PyPDF2 import PdfReader, PdfWriter# 定义 PDF 文件的路径,位置在当前工作目录下的 'practice_files' 文件夹中
pdf_path = Path.cwd() / 'practice_files' / 'split_and_rotate.pdf'# 读取指定路径的 PDF 文件
pdf_reader = PdfReader(str(pdf_path))# 创建一个 PDF 写入器对象,用于写入新的 PDF 文件
pdf_writer = PdfWriter()# 遍历 PDF 文件中的每一页
for page in range(len(pdf_reader.pages)):# 将当前页面旋转 -90 度,并添加到写入器中pdf_writer.add_page(pdf_reader.pages[page].rotate(-90))# 在用户的主目录下创建一个新的 PDF 文件 'rotated.pdf',以写入模式打开
with (Path.home() / 'rotated.pdf').open('wb') as f:# 将合并后的内容写入到新创建的文件中pdf_writer.write(f)

运行结果如下图:

在这里插入图片描述

代码解释

  1. 导入模块:
    • from pathlib import Path: 导入 Path 类,以方便处理文件路径。
    • from PyPDF2 import PdfReader, PdfWriter: 从 PyPDF2 导入 PdfReaderPdfWriter 类,用于读取和写入 PDF 文件。
  2. 定义 PDF 文件路径:
    • pdf_path = Path.cwd() / 'practice_files' / 'split_and_rotate.pdf': 使用 Path.cwd() 获取当前工作目录,并与 'practice_files''split_and_rotate.pdf' 连接,构建出完整的 PDF 文件路径。
  3. 读取 PDF 文件:
    • pdf_reader = PdfReader(str(pdf_path)): 使用 PdfReader 类实例化一个对象 pdf_reader,读取指定路径的 PDF 文件。此时,pdf_reader 包含了所有页面的信息。
  4. 创建 PDF 写入器:
    • pdf_writer = PdfWriter(): 实例化一个 PdfWriter 对象,用于创建新的 PDF 文件并写入内容。
  5. 遍历 PDF 文件的每一页:
    • for page in range(len(pdf_reader.pages)): 使用循环遍历 pdf_reader 中的每一页,len(pdf_reader.pages) 返回 PDF 文件的总页数。
    • pdf_writer.add_page(pdf_reader.pages[page].rotate(-90)): 取出当前页 (pdf_reader.pages[page]),调用 rotate(-90) 方法将该页旋转 -90 度(向左旋转),然后使用 add_page() 方法将旋转后的页面添加到 pdf_writer 对象中。
  6. 写入新的 PDF 文件:
    • with (Path.home() / 'rotated.pdf').open('wb') as f: 在用户的主目录下创建一个新的 PDF 文件,命名为 rotated.pdf,以二进制写入模式打开它。
    • pdf_writer.write(f): 将 pdf_writer 中的内容写入到新创建的 rotated.pdf 文件中,完成旋转操作后的 PDF 文件创建。

示例(2):

使用示例(1)中创建的rotated.pdf,将PDF中的每一页沿垂直中线分割开来,在home目录中创建一个新的PDF,命名为split.pdf。将分割后得到的页面保存在该文件中。示例源码如下:

from pathlib import Path
from PyPDF2 import PdfWriter, PdfReader
import copy# 定义 PDF 文件的路径,位置在用户的主目录下,文件名为 'rotated.pdf'
pdf_path = (Path.home() / 'rotated.pdf')# 读取指定路径的 PDF 文件
pdf_reader = PdfReader(str(pdf_path))
# 创建一个 PDF 写入器对象,用于写入新的 PDF 文件
pdf_writer = PdfWriter()# 获取第一个页面的右上角坐标
current_coords = pdf_reader.pages[0].mediabox.upper_right
# 遍历 PDF 文件中的每一页
for page in pdf_reader.pages:# 深拷贝当前页面,以创建左半边和右半边left_side = copy.deepcopy(page)right_side = copy.deepcopy(page)# 计算新坐标,将右上角的 X 坐标除以 2,Y 坐标保持不变new_coords = (current_coords[0] / 2, current_coords[1])# 设置左半边的右上角坐标为新坐标left_side.mediabox.upper_right = new_coords# 设置右半边的左上角坐标为新坐标right_side.mediabox.upper_left = new_coords# 将修改后的左半边页面添加到写入器中pdf_writer.add_page(left_side)# 将修改后的右半边页面也添加到写入器中pdf_writer.add_page(right_side)# 在当前工作目录下创建一个新的 PDF 文件 'split.pdf',以写入模式打开
with Path.cwd().joinpath('split.pdf').open('wb') as f:# 将合并后的内容写入到新创建的文件中pdf_writer.write(f)

运行结果如下:

截屏2024-10-09 19.30.03

代码解释

  1. 导入模块:
    • from pathlib import Path: 导入 Path 类,用于处理文件路径。
    • from PyPDF2 import PdfWriter, PdfReader: 从 PyPDF2 中导入 PdfWriterPdfReader,用于读取和生成 PDF 文件。
    • import copy: 导入 copy 模块,以便可以进行深拷贝操作。
  2. 定义 PDF 文件路径:
    • pdf_path = (Path.home() / 'rotated.pdf'): 使用 Path.home() 获取用户主目录,并与 'rotated.pdf' 拼接,构建出完整的 PDF 文件路径。
  3. 读取 PDF 文件:
    • pdf_reader = PdfReader(str(pdf_path)): 实例化一个 PdfReader 对象,读取指定路径的 PDF 文件。这将把文件中的所有页面信息加载到内存中。
  4. 创建 PDF 写入器:
    • pdf_writer = PdfWriter(): 实例化一个 PdfWriter 对象,用于创建新的 PDF 文件并写入内容。
  5. 获取页面坐标:
    • current_coords = pdf_reader.pages[0].mediabox.upper_right: 获取 PDF 的第一个页面的右上角坐标,这个坐标用于确定后续生成的两部分的尺寸。
  6. 遍历 PDF 文件中的每一页:
    • for page in pdf_reader.pages:: 遍历所有页面。
  7. 创建页面的深拷贝:
    • left_side = copy.deepcopy(page): 创建当前页面的一个深拷贝,用于生成左半边页面。
    • right_side = copy.deepcopy(page): 同样深拷贝当前页面,用于生成右半边页面。
  8. 计算新坐标:
    • new_coords = (current_coords[0] / 2, current_coords[1]): 将右上角的 X 坐标除以 2,保留 Y 坐标不变,计算出左半边和右半边的新边界坐标。
  9. 设置左右页面的坐标:
    • left_side.mediabox.upper_right = new_coords: 更新左半边页面的右上角坐标。
    • right_side.mediabox.upper_left = new_coords: 更新右半边页面的左上角坐标。
  10. 写入修改后的页面:
    • pdf_writer.add_page(left_side): 将左半边页面添加到 PDF 写入器。
    • pdf_writer.add_page(right_side): 将右半边页面也添加到 PDF 写入器。
  11. 输出新的 PDF 文件:
    • with Path.cwd().joinpath('split.pdf').open('wb') as f: 创建一个新的 PDF 文件,命名为 split.pdf,在当前工作目录下,以二进制写入模式打开。
    • pdf_writer.write(f): 将写入器中的内容(即左半边和右半边的页面)写入到新创建的 split.pdf 文件中。

希望此文对您有所启发和帮助,欢迎点赞、关注、转发!!!

相关文章:

Python对PDF文件页面的旋转和切割

Python对PDF文件页面的旋转和切割 利用Python的.rotate()方法和.mediabox属性对PDF页面进行旋转和切割,最终生成一个PDF。下面结合案例进行说明,本示例中的名为split_and_rotate.pdf文件在practice_files文件夹中, 示例(1&#…...

Android 10.0 修改Systemui三键导航栏虚拟按键颜色功能实现

1.前言 在10.0的系统ROM定制化开发中,在对systemui的相关定制化开发中,在某些产品中,需要修改相关的 导航栏三键导航的虚拟按键的颜色,修改掉原来默认的虚拟按键的黑白色,接下来就来实现相关的功能 2.修改Systemui三键导航栏虚拟按键颜色功能实现的核心类 frameworks\ba…...

『网络游戏』客户端使用PESorket发送消息到服务器【14】

上一章服务器已经完成使用PESorket 现在我们将其导出在客户端中使用 生成成功后复制 粘贴到Unity项目中 进入Assets文件夹 粘贴两个.dll 创建脚本:ClientSession.cs 编写脚本: ClientSession.cs 编写脚本:GameStart.cs 将GameStart.cs脚本绑定在摄像机上 运行服务器 运行客户端…...

JVM(学习预热 - 走进Java)(持续更新迭代)

目录 一、彻底认识Java虚拟机 开创世纪:Sun Classic 开创世纪:Exact VM 武林霸主:HotSpot VM 移动端虚拟机:Mobile/Embedded VM “三大”其二:BEA JRockit/IBM J9 VM 软硬结合:BEA Liquid VM/Azul VM…...

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

目录 1 C 程序内存区域划分 1.1 代码区 (Code Section) 1.2 全局/静态区 (Global/Static Section) 1.3 栈区 (Stack Section) 1.4 堆区 (Heap Section) 1.5 动态内存分配 2 void 指针(无类型指针) 2.1 void 指针介绍 2.2 void 指针的作用 2.3 …...

编译链接的过程发生了什么?

一:程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中,存在两个不同的环境。 第 1 种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境,它用于实际执行代码 也就是说:↓ 1&#xff1…...

【D3.js in Action 3 精译_028】3.4 小节 DIY 实战:使用 Observable 在线绘制 D3 条形图

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…...

【Linux】 TCP短服务编写和守护进程

文章目录 TCP 短服务编写流程进程组和会话和守护进程 TCP 短服务编写流程 TCP服务器是面向连接的,客户端在发送数据之前需要先与服务器建立连接。 因此,TCP服务器需要能够监听客户端的连接请求。为了实现这一功能,需要将TCP服务器创建的套接字…...

自学数据库-MYSQL

自学数据库-MYSQL 一.表和视图1.表1.1 表创建1.2 索引1.2.1 这里是废话,不感兴趣的可以直接更具目录的跳过这里的内容1.2.1.1 索引是什么1.2.1.2 相关数据结构:二叉树、红黑树、B-Tree、BTree、Hash…①普通索引②唯一索引③全文索引④组合索引 1.3 表数据操作(更新…...

机器学习——多模态学习

多模态学习:机器学习领域的新视野 引言 多模态学习(Multimodal Learning)是机器学习中的一个前沿领域,它涉及处理和整合来自多个数据模式(如图像、文本、音频等)的信息。随着深度学习的蓬勃发展&#xff0…...

​ceph掉电后无法启动osd,pgs unknown

处理办法: 只有1个osd,单副本,掉电损坏osd,只能考虑重建pg,丢失部分数据了。生产环境务必考虑2,3副本设计。避免掉电故障风险。 掉电后osdmap丢失无法启动osd的解决方案 - 武汉-磨渣 - 博客园 https://zhuanlan.zhih…...

HTML5实现古典音乐网站源码模板1

文章目录 1.设计来源1.1 网站首页1.2 古典音乐界面1.3 著名人物界面1.4 古典乐器界面1.5 历史起源界面2.效果和源码2.1 动态效果2.2 源代码源码下载万套模板,程序开发,在线开发,在线沟通作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/142…...

快速生成单元测试

1. Squaretest插件 2. 依赖 <dependency><groupId>junit</groupId>...

WebGL系列教程十一(光照原理及Blinn Phong着色模型)

快速导航&#xff08;持续更新中&#xff09; WebGL系列教程一&#xff08;开篇&#xff09; WebGL系列教程二&#xff08;环境搭建及着色器初始化&#xff09; WebGL系列教程三&#xff08;使用缓冲区绘制三角形&#xff09; WebGL系列教程四&#xff08;绘制彩色三角形&…...

《ASP.NET Web Forms 实现短视频点赞功能的完整示例》

在现代Web开发中&#xff0c;实现一个动态的点赞功能是非常常见的需求。本文将详细介绍如何在ASP.NET Web Forms中实现一个视频点赞功能&#xff0c;包括前端页面的展示和后端的处理逻辑。我们将确保点赞数量能够实时更新&#xff0c;而无需刷新整个页面。 技术栈 ASP.NET We…...

Linux SSH服务

Linux SSH&#xff08;Secure Shell&#xff09;服务是一种安全的远程登录协议&#xff0c;用于在Linux操作系统上远程登录和执行命令。它提供了加密的通信通道&#xff0c;可以在不安全的网络环境中安全地进行远程访问。 SSH服务在Linux系统中通常使用OpenSSH软件包来实现。它…...

MySQL--视图(详解)

目录 一、前言二、视图2.1概念2.2语法2.3创建视图2.3.1目的 2.4查看视图2.5修改数据2.5.1通过真实表修改数据&#xff0c;会影响视图2.5.2通过修改视图&#xff0c;会影响基表 2.6注意2.7 删除视图2.8 视图的优点 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&…...

Javascript 普通非async函数调用async函数

假设我们有一个异步函数 async function asyncFunction() {console.log("开始执行异步函数");await new Promise(resolve > setTimeout(resolve, 1000)); // 模拟异步操作console.log("异步函数执行完毕"); } 我们在调用这个异步函数时&#xff0c;比…...

【LeetCode】修炼之路-0004-Median of Two Sorted Arrays【python】

题目 Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. The overall run time complexity should be O(log (mn)). Example 1: Input: nums1 [1,3], nums2 [2] Output: 2.00000 Explanation: merged…...

C++面试速通宝典——10

177. #include <filename> 和 #include "filname.h" 有什么区别&#xff1f; ‌‌‌‌  对于 #include <filename> &#xff0c; 编译器从标准库路径开始搜索 filename.h。 ‌‌‌‌  对于 #include "filename.h&#xff0c;编译器从用户的工作…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...