python分割PDF为左右单页(均匀分割,保存原格式)

本文讲述了作者如何通过Python和PyPDF2库解决将A3格式的PDF转换为A4大小,同时保持分辨率的问题,包括如何将PDF均匀分割为左右单页,并提供了一个示例代码来处理多页PDF的拆分过程。
摘要由CSDN通过智能技术生成

写在最前面:用来批量分割PDF文档为左右单页,均匀分割!

真真python都没有的,先看这篇

先看这个【00基础】配置好python环境

折腾了很久

分割合并这个事情困扰了我很久,合并的事情之前有个帖子用合并图片的形式基本算是解决了【python自动水平拼合图像(拼接绘本用)】(当然,这个是通过拼图片来解决的,直接拼合pdf页面的工作等我有需要了再折腾)

分分合合,我发现我不仅需要拼合功能,更需要拆分的功能。

尝试1:Adobe acrobat pdf

我找到了官方的帖子裁剪 PDF 页面
我的版本在编辑pdf里裁剪页面
在这里插入图片描述
按照官方的说法,只是隐藏不是真的切割,我还不是很会操作这个。(还是想要更傻瓜一点)

WPS

不过网上的帖子表示wps的会员是可以很方便直接切割pdf的,可是我没有T^T。

尝试2:用Adobe Illustrator—可以处理单页

同事跟我介绍了用可以用Adobe Illustrator来做,就是预设好两个画板,再把pdf放进来,另存就行了,会得到pdf左右页面。
在这里插入图片描述
生成了按照画板切割的两个页面,并且在一个PDF中
缺点:我目前只能一页页处理,对于多页pdf不知道怎么批量操作
在这里插入图片描述

试试python

诉求

  • 比如老师发了A3的试卷让孩子打印,但是家里打印机只能打印A4,我怎么能不降低分辨率用A4给孩子打印试卷?
  • 比如我有一个对页排的pdf(比如我之前拼完的那样),但是我现在想要用打印机打成双面的小册子来看,怎么办???

小册子:就像是路边发的广告小册子,按照页码排版,中间用订书机钉起来那种。需要左右页单拆并且按照页码规律重新拼打印

要求

  • 直接处理多页的pdf文件,均匀切分为左右。均匀切分
  • 为了不降低文件的分辨率,不转成图片处理,原文件数据可以保留
  • 成果为单页左和单页右,比如原PDF有n页,那生成的文件是2n个单独页面,分别由原页面左侧页面和右侧页面组成
  • 成果要有序号,方便重新组合

没有要求成果直接合成一整个pdf是为了后续灵活处理,毕竟合并pdf文件是小事。

效果

原始pdf(上次用单页图片合成的本子)
在这里插入图片描述
拆分后
在这里插入图片描述

补充点

上面用来演示的因为原本就是图片合成的,所以就还是图片。如果源文件是类似于别的格式导出而成的(比如PPT、WORD、EXCEL等),PDF是带有可读内容的,这个代码尽可能保存了原PDF的可读性,不会降低精度。

再补充两句废话:看一下这里先看这个【00基础】配置好python环境

  • PyPDF2 包先装一下
    在这里插入图片描述

  • 黏贴好代码后,修改源文件路径和目标文件夹路径
    在这里插入图片描述

源代码

没有做成收费收积分的文件分享,是因为我刚开始学python,也在无私的大佬那里获得过很多帮助。我想会来看我文章的应该也是初学者,求个工具方便好用。并且手头也并没有多少可用的积分,还怕自己碰到骗子,下载下来的代码不可用。

# -*- coding: utf-8 -*-
"""
Created on Mon Jan  8 14:28:03 2024
python3 
用于分割PDF,如A3版面pdf分割为A4大小左右单侧页面单独文件
@author: Joy_cxz
csdn:https://blog.csdn.net/cxz_0030115?type=blog
"""
import os
from PyPDF2 import PdfFileReader, PdfFileWriter, PageObject

def split_pdf_page(pdf_reader, page_number, output_folder):
    original_page = pdf_reader.getPage(page_number)
    page_width = float(original_page.mediaBox.getUpperRight_x())
    page_height = float(original_page.mediaBox.getUpperRight_y())
    left_page = PageObject.createBlankPage(width=page_width / 2, height=page_height)
    left_page.mergeScaledTranslatedPage(original_page, 1, 0, 0)
    right_page = PageObject.createBlankPage(width=page_width / 2, height=page_height)
    right_page.mergeScaledTranslatedPage(original_page, 1, -page_width / 2, 0)
    left_page.mediaBox.upperRight = (page_width / 2, page_height)
    right_page.mediaBox.upperRight = (page_width / 2, page_height)
    left_pdf = PdfFileWriter()
    right_pdf = PdfFileWriter()
    left_pdf.addPage(left_page)
    right_pdf.addPage(right_page)
    with open(os.path.join(output_folder, f'page_{page_number}_left.pdf'), 'wb') as left_out:
        left_pdf.write(left_out)        
    with open(os.path.join(output_folder, f'page_{page_number}_right.pdf'), 'wb') as right_out:
        right_pdf.write(right_out)

def split_all_pages_in_pdf(input_pdf_path, output_folder):
    pdf_reader = PdfFileReader(open(input_pdf_path, 'rb'))
    for page_number in range(pdf_reader.numPages):
        split_pdf_page(pdf_reader, page_number, output_folder)

# 指定PDF文件和输出文件夹路径
input_pdf_path = r'C:\Users\Desktop\test\T001.pdf'  # 替换PDF文件路径
output_folder = r'C:\Users\Desktop\test'  # 替换为输出文件夹路径

split_all_pages_in_pdf(input_pdf_path, output_folder)

以下是使用Python实现PDF分割的基本步骤: 1. 安装PyPDF2库 ``` pip install PyPDF2 ``` 2. 导入PyPDF2库 ```python import PyPDF2 ``` 3. 打开PDF文件 ```python pdf_file = open('example.pdf', 'rb') ``` 4. 创建PDF读取器对象 ```python pdf_reader = PyPDF2.PdfFileReader(pdf_file) ``` 5. 获取PDF文件页数 ```python page_count = pdf_reader.getNumPages() ``` 6. 分割PDF文件 例如,将一个10页的PDF文件拆分成两个文件,每个文件包含5页。 ```python # 创建PDF写入器对象 pdf_writer = PyPDF2.PdfFileWriter() # 拆分PDF文件,将前5页写入第一个文件 for page_num in range(5): page_obj = pdf_reader.getPage(page_num) pdf_writer.addPage(page_obj) with open('file1.pdf', 'wb') as output_file: pdf_writer.write(output_file) # 将后5页写入第二个文件 pdf_writer = PyPDF2.PdfFileWriter() for page_num in range(5, page_count): page_obj = pdf_reader.getPage(page_num) pdf_writer.addPage(page_obj) with open('file2.pdf', 'wb') as output_file: pdf_writer.write(output_file) ``` 7. 关闭PDF文件 ```python pdf_file.close() ``` 完整代码示例: ```python import PyPDF2 # 打开PDF文件 pdf_file = open('example.pdf', 'rb') # 创建PDF读取器对象 pdf_reader = PyPDF2.PdfFileReader(pdf_file) # 获取PDF文件页数 page_count = pdf_reader.getNumPages() # 拆分PDF文件,将前5页写入第一个文件 pdf_writer = PyPDF2.PdfFileWriter() for page_num in range(5): page_obj = pdf_reader.getPage(page_num) pdf_writer.addPage(page_obj) with open('file1.pdf', 'wb') as output_file: pdf_writer.write(output_file) # 将后5页写入第二个文件 pdf_writer = PyPDF2.PdfFileWriter() for page_num in range(5, page_count): page_obj = pdf_reader.getPage(page_num) pdf_writer.addPage(page_obj) with open('file2.pdf', 'wb') as output_file: pdf_writer.write(output_file) # 关闭PDF文件 pdf_file.close() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值