运行效果

原始PDF

分割后PDF

一、python代码(用的是python3.9.0版本)

import os
import tempfile
from pdf2image import convert_from_path
from PIL import Image
from PyPDF2 import PdfReader, PdfWriterdef split_pdf_page(pdf_path, output_path):# Convert PDF to imagesimages = convert_from_path(pdf_path)# Create a PdfWriter object for the output PDFoutput_pdf = PdfWriter()# Create a list to store the parts of all imagesimg_parts_all = []for img in images:# Split the image into 4 partswidth, height = img.sizeimg_parts = [img.crop((0, 0, width // 2, height // 2)),  # Top leftimg.crop((width // 2, 0, width, height // 2)),  # Top rightimg.crop((0, height // 2, width // 2, height)),  # Bottom leftimg.crop((width // 2, height // 2, width, height)),  # Bottom right]# Append the parts of this image to the listimg_parts_all.extend(img_parts)# Convert each image part back to PDF and add it to the output PDFfor img_part in img_parts_all:fd, temp_filename = tempfile.mkstemp(suffix=".pdf")  # Create a new temp fileos.close(fd)  # Close the file descriptor, we only need the filenameimg_part.save(temp_filename, "PDF")  # Save the PIL Image as a PDFpdf = PdfReader(temp_filename)  # Load the PDF fileoutput_pdf.add_page(pdf.pages[0])  # Add the page to the output PDFos.remove(temp_filename)  # Remove the temp file# Write the output PDF to a filewith open(output_path, "wb") as f:output_pdf.write(f)# Test the function
split_pdf_page("input.pdf", "output.pdf")

默认是脚本文件与input.pdf放在一个文件夹目录内

二、代码解释

  1. 首先,我们使用convert_from_path函数从pdf2image库将PDF文件转换为图像,这样我们就可以使用Python的图像处理库PIL处理这些图像了。

  2. 然后,我们创建一个PdfWriter对象,它将被用于生成新的PDF文件。

  3. for img in images:循环中,我们处理从PDF文件中提取出的每一张图像:

    • 首先,我们使用img.size获取图像的尺寸(宽度和高度)。
    • 然后,我们使用img.crop函数将图像分割为四部分。这个函数需要一个四元组作为参数,这个四元组表示一个矩形区域:(left, upper, right, lower),它们分别表示矩形左边,上边,右边,和下边的坐标。
    • 我们将这四部分图像存储在img_parts列表中,并使用img_parts_all.extend(img_parts)将这个列表添加到img_parts_all中。
  4. for img_part in img_parts_all:循环中,我们将每一部分图像转换回PDF,并添加到输出PDF中:

    • 使用tempfile.mkstemp函数创建一个新的临时文件,这个函数会返回一个文件描述符和文件的路径。我们只需要文件的路径,所以立即关闭了文件描述符。
    • 使用img_part.save函数将PIL图像保存为PDF格式。
    • 使用PdfReader从临时文件中读取PDF文件,然后使用output_pdf.add_page将PDF文件的第一页(也是唯一的一页)添加到输出PDF中。
    • 最后,我们使用os.remove删除临时文件。
  5. 最后,我们将输出PDF写入文件。

需要注意的是,我们假设了输入PDF的每一页都可以等分为四个部分。如果有些页的尺寸不符合这个假设,可能需要对代码进行一些修改。

三、代码运行准备

首先安装python库:PyPDF2pdf2image、Pillow

pip install PyPDF2 pdf2image Pillow

另外,pdf2image库需要使用到poppler-utils

在Ubuntu系统下,你可以使用以下命令安装:

sudo apt-get install -y poppler-utils

在windows系统下

  1. 首先,从这个页面下载Poppler for Windows的二进制文件。你应该下载最新版本的文件。

  2. 下载后,你需要解压下载的文件。解压到你喜欢的任何位置,例如C:\poppler

  3. 接下来,你需要将Poppler的二进制文件添加到你的系统路径中。这样Python就可以在任何地方访问它。右击“计算机”->选择“属性”->点击“高级系统设置”->点击“环境变量”->在“系统变量”下找到“Path”并点击“编辑”->在变量值的最后输入你刚刚解压Poppler的位置,并在前后添加分号;。例如,如果你将其解压到C:\poppler,那么你应该添加C:\poppler\bin

  4. 最后,你需要重新启动你的命令行界面,以使这些改变生效。

安装完毕,到文件夹目录下打开命令行界面使用:

python script.py

即可运行该python文件

将PDF1页分割为4页相关推荐

  1. 将一个PPT文档按页分割成多个PPT文档的代码

    1.打开需要分割的PPT文档(假设文件名为"原始文档.ppt"): 2.键入Alt+F11切换到VBA编辑环境,然后选择菜单"插入-模块": 3.在代码编辑区粘 ...

  2. python+win32com分割多页ppt为单页多文件

    1st.安装win32com ***pip install pypiwin32*** python通过我win32com模块可以使用Windows系统上的应用,具体使用可以通过OLEViewer进行查 ...

  3. JavaScript 网页打印预览,图片跨页分割

    开始时是这样的, 打印的控件是用iframe写的,图片用js一张张插入到div中,遇到的问题是长图片跨页分割,短图片挤在一页 解决方法 // 插入图片方法 function addImg() {var ...

  4. 简单步骤:wps如何从一页之后开始定义页眉和页脚

    一般以前word都是用分节符分割前一页和后一页的页眉和页脚.而在wps中使用却很方便.步骤入下: 1 光标点击希望添加页眉和页脚的所在页 插入-->页眉和页脚,写入要添加的页眉和页脚内容.这时候 ...

  5. mysql 上一页下一页_实现“上一页”和“下一页按钮

    实现"上一页"和"下一页按钮 发布时间:2016-06-17 来源: 点击: 次 //本例子摘自phpbuilder.com //稍加翻译 // $limit=20; / ...

  6. mysql+翻页性能,mysql 翻页优化

    mysql翻页优化 对于翻页,我们通常是用 select fields from table limit 100,10 但是当要越翻后面的页数之后,耗时变得很长 select fields from ...

  7. GridView自定义分页样式(上一页,下一页,到第几页)(新手教程)

    今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1).演示地址http://www.veryam. ...

  8. vue从其它页面返回_vue---详细页点返回列表页,停留在原先位置

    列表页面,点击进入到详情页面,在详情页面向下滑动时,滚动条变化,document.documentElement.scrollTop变化,点击返回按钮时,列表页面的document.documentE ...

  9. GridView分页(第一页、上一页、下一页、最后页、当前页数/总页数)

    前台GridView页脚代码: Code <PagerTemplate>                 <table width="100%">      ...

最新文章

  1. elk系列7之通过grok分析apache日志
  2. docker笔记1----Get Docker
  3. jQuery元素操作
  4. delhpi7 tcombobox清楚重复项_专利数据统计中需要搞清楚的首要问题(2)
  5. 2014编程之美初赛第二场
  6. 爱奇艺2020校招编程题汇总第一题(切方块问题)
  7. Spring4.x()--Spring的Jdbc事务-零配置
  8. java找_Java基础之:查找
  9. c语言2维动态数组,如何创建一个动态2维数组?
  10. axios创建实例对象发送ajax请求_解决一个网页请求多个服务器场景---axios工作笔记009
  11. sublime中html自动对齐,sublime text怎么对齐HTML代码
  12. mysql 改进前序遍历树_“无限层级传销”系统设计?前序遍历树的Mysql方案
  13. Python知识点(史上最全)
  14. c语言程序设计 姜书浩,Access 数据库实践教程
  15. 围棋AI kataGo下载
  16. 解决regedit taskmgr不能启动
  17. python任务编排_工作流中的任务编排与治理
  18. 满腔热诚永不忘,我以我血荐轩辕!
  19. android stretchpanel控件,TableLayoutPanel 这个控件有没有替代的,而且可以动态Sizable,该如何解决...
  20. Ego的Spring框架笔记

热门文章

  1. 批量删除订阅kindle、kindle touch 推送
  2. 对于最近工作的一些感悟和复盘
  3. spring boot 是真滴好用
  4. ArcGIS基础实验操作100例--实验20按像元修改栅格值
  5. 市场调研报告-全球与中国网络视频会议(网络研讨会)软件市场现状及未来发展趋势
  6. 浏览器之战将进入HTML5时代
  7. 精选28套Java实战项目大合集
  8. 学生python编程--学习列表绘制彩虹
  9. Java入门小练习:彩票小程序
  10. 高仿萌聚 app ,内容简直是宅男福利啊