将PDF1页分割为4页
运行效果
原始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放在一个文件夹目录内
二、代码解释
首先,我们使用
convert_from_path
函数从pdf2image
库将PDF文件转换为图像,这样我们就可以使用Python的图像处理库PIL处理这些图像了。然后,我们创建一个
PdfWriter
对象,它将被用于生成新的PDF文件。在
for img in images:
循环中,我们处理从PDF文件中提取出的每一张图像:- 首先,我们使用
img.size
获取图像的尺寸(宽度和高度)。 - 然后,我们使用
img.crop
函数将图像分割为四部分。这个函数需要一个四元组作为参数,这个四元组表示一个矩形区域:(left, upper, right, lower)
,它们分别表示矩形左边,上边,右边,和下边的坐标。 - 我们将这四部分图像存储在
img_parts
列表中,并使用img_parts_all.extend(img_parts)
将这个列表添加到img_parts_all
中。
- 首先,我们使用
在
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
删除临时文件。
- 使用
最后,我们将输出PDF写入文件。
需要注意的是,我们假设了输入PDF的每一页都可以等分为四个部分。如果有些页的尺寸不符合这个假设,可能需要对代码进行一些修改。
三、代码运行准备
首先安装python库:PyPDF2
,pdf2image、Pillow
pip install PyPDF2 pdf2image Pillow
另外,pdf2image
库需要使用到poppler-utils
在Ubuntu系统下,你可以使用以下命令安装:
sudo apt-get install -y poppler-utils
在windows系统下
首先,从这个页面下载Poppler for Windows的二进制文件。你应该下载最新版本的文件。
下载后,你需要解压下载的文件。解压到你喜欢的任何位置,例如
C:\poppler
。接下来,你需要将Poppler的二进制文件添加到你的系统路径中。这样Python就可以在任何地方访问它。右击“计算机”->选择“属性”->点击“高级系统设置”->点击“环境变量”->在“系统变量”下找到“Path”并点击“编辑”->在变量值的最后输入你刚刚解压Poppler的位置,并在前后添加分号
;
。例如,如果你将其解压到C:\poppler
,那么你应该添加C:\poppler\bin
。最后,你需要重新启动你的命令行界面,以使这些改变生效。
安装完毕,到文件夹目录下打开命令行界面使用:
python script.py
即可运行该python文件
将PDF1页分割为4页相关推荐
- 将一个PPT文档按页分割成多个PPT文档的代码
1.打开需要分割的PPT文档(假设文件名为"原始文档.ppt"): 2.键入Alt+F11切换到VBA编辑环境,然后选择菜单"插入-模块": 3.在代码编辑区粘 ...
- python+win32com分割多页ppt为单页多文件
1st.安装win32com ***pip install pypiwin32*** python通过我win32com模块可以使用Windows系统上的应用,具体使用可以通过OLEViewer进行查 ...
- JavaScript 网页打印预览,图片跨页分割
开始时是这样的, 打印的控件是用iframe写的,图片用js一张张插入到div中,遇到的问题是长图片跨页分割,短图片挤在一页 解决方法 // 插入图片方法 function addImg() {var ...
- 简单步骤:wps如何从一页之后开始定义页眉和页脚
一般以前word都是用分节符分割前一页和后一页的页眉和页脚.而在wps中使用却很方便.步骤入下: 1 光标点击希望添加页眉和页脚的所在页 插入-->页眉和页脚,写入要添加的页眉和页脚内容.这时候 ...
- mysql 上一页下一页_实现“上一页”和“下一页按钮
实现"上一页"和"下一页按钮 发布时间:2016-06-17 来源: 点击: 次 //本例子摘自phpbuilder.com //稍加翻译 // $limit=20; / ...
- mysql+翻页性能,mysql 翻页优化
mysql翻页优化 对于翻页,我们通常是用 select fields from table limit 100,10 但是当要越翻后面的页数之后,耗时变得很长 select fields from ...
- GridView自定义分页样式(上一页,下一页,到第几页)(新手教程)
今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1).演示地址http://www.veryam. ...
- vue从其它页面返回_vue---详细页点返回列表页,停留在原先位置
列表页面,点击进入到详情页面,在详情页面向下滑动时,滚动条变化,document.documentElement.scrollTop变化,点击返回按钮时,列表页面的document.documentE ...
- GridView分页(第一页、上一页、下一页、最后页、当前页数/总页数)
前台GridView页脚代码: Code <PagerTemplate> <table width="100%"> ...
最新文章
- elk系列7之通过grok分析apache日志
- docker笔记1----Get Docker
- jQuery元素操作
- delhpi7 tcombobox清楚重复项_专利数据统计中需要搞清楚的首要问题(2)
- 2014编程之美初赛第二场
- 爱奇艺2020校招编程题汇总第一题(切方块问题)
- Spring4.x()--Spring的Jdbc事务-零配置
- java找_Java基础之:查找
- c语言2维动态数组,如何创建一个动态2维数组?
- axios创建实例对象发送ajax请求_解决一个网页请求多个服务器场景---axios工作笔记009
- sublime中html自动对齐,sublime text怎么对齐HTML代码
- mysql 改进前序遍历树_“无限层级传销”系统设计?前序遍历树的Mysql方案
- Python知识点(史上最全)
- c语言程序设计 姜书浩,Access 数据库实践教程
- 围棋AI kataGo下载
- 解决regedit taskmgr不能启动
- python任务编排_工作流中的任务编排与治理
- 满腔热诚永不忘,我以我血荐轩辕!
- android stretchpanel控件,TableLayoutPanel 这个控件有没有替代的,而且可以动态Sizable,该如何解决...
- Ego的Spring框架笔记