将A3 PDF转换成A4 PDF,方便A4纸打印(由于直接缩印看不清楚字)
原始PDF 总18页 input.pdf
A3 PDF
分割后的PDF 总36页 output.pdf
A4 PDF
PDF代码如下:
import os,sys
os.chdir(sys.path[0])
import fitz # 导入PyMuPDF库
def split_pdf_vertically(input_path, output_path):
# 打开源PDF文件
source_doc = fitz.open(input_path)
# 创建新的PDF文档
new_doc = fitz.open()
# 遍历源PDF的每一页
for page_num in range(len(source_doc)):
# 获取当前页面
page = source_doc.load_page(page_num)
# 获取页面尺寸
page_rect = page.rect
width = page_rect.width
height = page_rect.height
# 计算左半部分和右半部分的区域
left_half = fitz.Rect(
page_rect.x0, # 左边界
page_rect.y0, # 上边界
page_rect.x0 + width/2, # 右边界(中间位置)
page_rect.y1 # 下边界
)
right_half = fitz.Rect(
page_rect.x0 + width/2, # 左边界(中间位置)
page_rect.y0, # 上边界
page_rect.x1, # 右边界
page_rect.y1 # 下边界
)
# 创建左半页并添加到新文档
new_page_left = new_doc.new_page(width=width/2, height=height)
# 正确参数:目标区域,源文档,源页码,裁剪区域
new_page_left.show_pdf_page(
new_page_left.rect, # 目标区域
source_doc, # 源文档对象(关键参数)
page_num, # 源页码
clip=left_half # 裁剪区域
)
# 创建右半页并添加到新文档
new_page_right = new_doc.new_page(width=width/2, height=height)
new_page_right.show_pdf_page(
new_page_right.rect,
source_doc,
page_num,
clip=right_half
)
# 保存新PDF文件
new_doc.save(output_path)
# 关闭文档释放资源
source_doc.close()
new_doc.close()
print(f"成功将PDF分割为新文件:{output_path}")
# 使用示例
if __name__ == "__main__":
split_pdf_vertically("input.pdf", "output.pdf")
安装环境
pip install PyMuPDF
代码解释:
这段代码的主要功能是将PDF文件的每一页纵向分割成两个独立的页面,并生成一个新的PDF文件。下面是对代码的详细解释:
### 整体流程
代码通过PyMuPDF(fitz)库操作PDF文件,核心逻辑是读取原始PDF的每一页,将其纵向(垂直)分成左右两部分,然后将这两部分分别作为新页面保存到新的PDF文件中。
### 逐部分解释
1. **导入库**
```python
import fitz # 导入PyMuPDF库
导入PyMuPDF库(通常用fitz作为别名),这是一个处理PDF文件的高效库。
-
定义分割函数
def split_pdf_vertically(input_path, output_path):定义一个函数,接收两个参数:
-
input_path:原始PDF文件的路径 -
output_path:生成的新PDF文件的路径
-
-
打开PDF文件
source_doc = fitz.open(input_path) # 打开源PDF new_doc = fitz.open() # 创建新的空白PDF- 打开原始PDF文件,获取一个文档对象
source_doc - 创建一个新的空白PDF文档对象
new_doc
- 打开原始PDF文件,获取一个文档对象
-
遍历原始PDF的每一页
for page_num in range(len(source_doc)): page = source_doc.load_page(page_num) # 加载当前页 page_rect = page.rect # 获取页面尺寸信息 width = page_rect.width # 页面宽度 height = page_rect.height # 页面高度- 循环处理原始PDF中的每一页
-
page_rect包含页面的尺寸信息(坐标和宽高)
-
定义分割区域
# 左半部分区域 left_half = fitz.Rect( page_rect.x0, # 左边界(原页面左边界) page_rect.y0, # 上边界(原页面上边界) page_rect.x0 + width/2, # 右边界(原页面中间) page_rect.y1 # 下边界(原页面下边界) ) # 右半部分区域 right_half = fitz.Rect( page_rect.x0 + width/2, # 左边界(原页面中间) page_rect.y0, # 上边界(原页面上边界) page_rect.x1, # 右边界(原页面右边界) page_rect.y1 # 下边界(原页面下边界) )- 使用
fitz.Rect定义两个矩形区域,将原始页面从中间垂直分割 - 左半部分占原页面宽度的50%,右半部分占剩下的50%
- 使用
-
创建新页面并添加内容
# 创建左半页 new_page_left = new_doc.new_page(width=width/2, height=height) new_page_left.show_pdf_page( new_page_left.rect, # 目标区域(新页面的尺寸) source_doc, # 源PDF文档 page_num, # 源页面编号 clip=left_half # 裁剪区域(只取左半部分) ) # 创建右半页(类似左半页操作) new_page_right = new_doc.new_page(width=width/2, height=height) new_page_right.show_pdf_page( new_page_right.rect, source_doc, page_num, clip=right_half )- 为左半部分创建一个新页面,宽度是原页面的一半
- 使用
show_pdf_page()方法将原始页面的左半部分内容复制到新页面 - 对右半部分执行相同操作
-
保存并关闭文件
new_doc.save(output_path) # 保存新PDF source_doc.close() # 关闭源文件 new_doc.close() # 关闭新文件 print(f"成功将PDF分割为新文件:{output_path}")- 保存新生成的PDF文件
- 关闭所有文档对象以释放资源
- 打印成功信息
-
函数调用
if __name__ == "__main__": split_pdf_vertically("input.pdf", "output.pdf")- 当脚本直接运行时,调用分割函数,处理当前目录下的
input.pdf,生成output.pdf
- 当脚本直接运行时,调用分割函数,处理当前目录下的
最终效果
假设原始PDF有3页,运行代码后会生成一个6页的新PDF:
- 新PDF的第1页 = 原始第1页的左半部分
- 新PDF的第2页 = 原始第1页的右半部分
- 新PDF的第3页 = 原始第2页的左半部分
- 以此类推...
这种分割方式特别适合将宽幅PDF(如A3)转换为适合A4纸打印的格式,每一半都可以单独打印在A4纸上。














网友评论