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度后保存到该文件中。原始文件如下:
image.png

下面将以上的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)

运行结果如下图:

image.png

代码解释

1.导入模块:

  • from pathlib import Path: 导入 Path 类,以方便处理文件路径。
  • from PyPDF2 import PdfReader, PdfWriter: 从 PyPDF2 导入 PdfReader 和 PdfWriter 类,用于读取和写入 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)

运行结果如下:
image.png

代码解释
1.导入模块:

  • from pathlib import Path: 导入 Path 类,用于处理文件路径。
  • from PyPDF2 import PdfWriter, PdfReader: 从 PyPDF2 中导入 PdfWriter
    和 PdfReader,用于读取和生成 PDF 文件。
    2.import copy: 导入 copy 模块,以便可以进行深拷贝操作。
    3.定义 PDF 文件路径:
    • pdf_path = (Path.home() / 'rotated.pdf'): 使用 Path.home() 获取用户主目录,并与 'rotated.pdf' 拼接,构建出完整的 PDF 文件路径。

4.读取 PDF 文件:

  • pdf_reader = PdfReader(str(pdf_path)): 实例化一个 PdfReader 对象,读取指定路径的 PDF 文件。这将把文件中的所有页面信息加载到内存中。

5.创建 PDF 写入器:

  • pdf_writer = PdfWriter(): 实例化一个 PdfWriter 对象,用于创建新的 PDF 文件并写入内容。

6.获取页面坐标:

  • current_coords = pdf_reader.pages[0].mediabox.upper_right: 获取 PDF 的第一个页面的右上角坐标,这个坐标用于确定后续生成的两部分的尺寸。

7.遍历 PDF 文件中的每一页:

  • for page in pdf_reader.pages:: 遍历所有页面。

8.创建页面的深拷贝:

  • left_side = copy.deepcopy(page): 创建当前页面的一个深拷贝,用于生成左半边页面。
  • right_side = copy.deepcopy(page): 同样深拷贝当前页面,用于生成右半边页面。
    9.计算新坐标:
    new_coords = (current_coords[0] / 2, current_coords[1]): 将右上角的 X 坐标除以 2,保留 Y 坐标不变,计算出左半边和右半边的新边界坐标。
    10.设置左右页面的坐标:
  • left_side.mediabox.upper_right = new_coords: 更新左半边页面的右上角坐标。
  • right_side.mediabox.upper_left = new_coords: 更新右半边页面的左上角坐标。

11.写入修改后的页面:

  • pdf_writer.add_page(left_side): 将左半边页面添加到 PDF 写入器。
  • pdf_writer.add_page(right_side): 将右半边页面也添加到 PDF 写入器。

12.输出新的 PDF 文件:

  • with Path.cwd().joinpath('split.pdf').open('wb') as f: 创建一个新的 PDF 文件,命名为 split.pdf,在当前工作目录下,以二进制写入模式打开。
  • pdf_writer.write(f): 将写入器中的内容(即左半边和右半边的页面)写入到新创建的 split.pdf 文件中。

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

相关文章
|
28天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
105 63
|
7天前
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
73 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
11天前
|
JavaScript
jquery图片和pdf文件预览插件
EZView.js是一款jquery图片和pdf文件预览插件。EZView.js可以为图片和pdf格式文件生成在线预览效果。支持的文件格式有pdf、jpg、 png、jpeg、gif。
41 16
|
10天前
|
计算机视觉 Python
如何使用Python将TS文件转换为MP4
本文介绍了如何使用Python和FFmpeg将TS文件转换为MP4文件。首先需要安装Python和FFmpeg,然后通过`subprocess`模块调用FFmpeg命令,实现文件格式的转换。代码示例展示了具体的操作步骤,包括检查文件存在性、构建FFmpeg命令和执行转换过程。
34 7
|
2月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
1月前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
49 2
|
1月前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
2月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
2月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
2月前
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。