python实现pdf双页文档转png图片,png图片裁剪为左右两等分,再合并为新的pdf单页文档

一、问题引入

现有pdf双页文档如下:
在这里插入图片描述
现按照以下页码次序对pdf双页文档进行裁剪和拼接,其中有两点需要特别注意,一是封面页只裁剪中间部分,二是文档是从右往左的顺序排版的
在这里插入图片描述

二、python程序

import os
import office
from PIL import Image
import img2pdf# 新建两个文件夹分别存储裁剪前和裁剪后的图片
def newfolders():for folder in ['images before cropping', 'images after cropping']:if os.path.isdir(folder) == False:os.mkdir(folder)# pdf双页文档转为多张png图片
def pdf_to_images(pdf_path):office.pdf.pdf2imgs(pdf_path=pdf_path, out_dir='images before cropping')# png图片批量裁剪为左右两等分
def images_cropping(pdf_name):images = os.listdir('images before cropping')images.sort(key=lambda x: int(x.replace(' [' + pdf_name.split('.')[0] + ']-', '').split('.')[0]))index = 0for image in images:image = Image.open('images before cropping/' + image)width, height = image.sizeitem_width = int(width / 2)item_height = int(height / 2)box_list = []if index == 0:box = (int(item_width / 2), 0, int(item_width * 3 / 2), height)box_list.append(box)else:for i in range(2):# box = (i * item_width, 0, (i + 1) * item_width, height)  # 从左往右box = (abs(i - 1) * item_width, 0, (abs(i - 1) + 1) * item_width, height)  # 从右往左box_list.append(box)image_list = [image.crop(box) for box in box_list]for j in range(len(image_list)):image_list[j].save('images after cropping/' + str(2 * index + 1 + j) + '.png', 'PNG')index += 1# 裁剪后的png图片合并为新的pdf单页文档
def images_to_pdf(pdf_name):images = os.listdir('images after cropping')images.sort(key=lambda x: int(x.split('.')[0]))images = ['images after cropping/' + i for i in images]with open('pdf/' + pdf_name, 'wb') as f:f.write(img2pdf.convert(images))if __name__ == '__main__':pdf_name = '名探偵コナン日本語版第100巻.pdf'new_pdf_name = '名侦探柯南日文版第100卷.pdf'pdf_path = 'pdf/' + pdf_namenewfolders()  # 新建两个文件夹分别存储裁剪前和裁剪后的图片pdf_to_images(pdf_path)  # pdf双页文档转为多张png图片images_cropping(pdf_name)  # png图片批量裁剪为左右两等分images_to_pdf(new_pdf_name)  # 裁剪后的png图片合并为新的pdf单页文档# 文档树:# │  main.py# │# ├─images after cropping# │      1.png# │      10.png# │      100.png# │      101.png# │      102.png# │      103.png#        ……# │      95.png# │      96.png# │      97.png# │      98.png# │      99.png# │# ├─images before cropping# │      [名探偵コナン日本語版第100巻]-0.jpg# │      [名探偵コナン日本語版第100巻]-1.jpg# │      [名探偵コナン日本語版第100巻]-10.jpg# │      [名探偵コナン日本語版第100巻]-100.jpg# │      [名探偵コナン日本語版第100巻]-11.jpg# │      [名探偵コナン日本語版第100巻]-12.jpg# │      [名探偵コナン日本語版第100巻]-13.jpg#        ……# │      [名探偵コナン日本語版第100巻]-95.jpg# │      [名探偵コナン日本語版第100巻]-96.jpg# │      [名探偵コナン日本語版第100巻]-97.jpg# │      [名探偵コナン日本語版第100巻]-98.jpg# │      [名探偵コナン日本語版第100巻]-99.jpg# │# └─pdf#        名侦探柯南日文版第100卷.pdf#        名探偵コナン日本語版第100巻.pdf

三、效果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试系列 - String字符串使用详解

String 类是 Java 中最常用的类之一,它用于表示和操作字符串。字符串是一系列字符的序列,可以包含字母、数字、符号等。在 Java 中,String 类是不可变的,这意味着一旦创建了字符串对象,它的内容就不能被修改。 一、常…

python学习--基本数据类型之字典

python中数据类型 第一类:不可变类型、静态数据类型、不支持增删改操作 数字(number)字符串(string)元组(tuple) 第二类:可变类型、动态数据类型、支持增删改操作 列表&#xff…

Android中的view绘制流程,简单理解

简单理解 Android中的View类代表用户界面中基本的构建块。一个View在屏幕中占据一个矩形区域、并且负责绘制和事件处理。View是所有widgets的基础类,widgets是我们通常用于创建和用户交互的组件,比如按钮、文本输入框等等。子类ViewGroup是所有布局&…

java 实现单例模式

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一种全局访问该实例的方式。在Java中,可以使用多种方式来实现单例模式,下面整理了几种常见的实现方式。 饿汉式单例模式(Eager Initialization)&…

深度强化学习算法的参数更新时机

深度强化学习算法的参数更新时机 深度强化学习中往往涉及到多个神经网络来拟合策略函数、值函数等,什么时候更新参数因算法而异,与具体算法架构/算法思想紧密相关。 算法参数更新时机架构DQN先收集一定经验,然后每步更新Off Policy Value-B…

day 6

在c和c中static用法 1.static修饰全局变量,默认初始化为0 2.static修饰局部变量,延长生命周期,不改变作用域 3.static修饰函数只能在当前文件使用 4.static修饰的全局变量变量不能被extern引用 5.static修饰的指针不能指向auto类型的地址…

数学建模--层次分析法(AHP)的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法 不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可…

【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入

目录 0x00 前言: 0x02 解决: 0x00 前言: 本篇博文可能会有一点点的超级呆 0x02 解决: 你是不是也会想: 使用pyrhon将指定文件夹位置里面的1.txt中数据全部删除以后---->然后再将参数req_text的值写入到1.txt …

HDFS HA 高可用集群搭建详细图文教程

目录 一、高可用(HA)的背景知识 1.1 单点故障 1.2 如何解决单点故障 1.2.1 主备集群 1.2.2 Active、Standby 1.2.3 高可用 1.2.4 集群可用性评判标准(x 个 9) 1.3 HA 系统设计核心问题 1.3.1 脑裂问题 1.3.2 数据状…

Pytorch从零开始实战01

Pytorch从零开始实战——MNIST手写数字识别 文章目录 Pytorch从零开始实战——MNIST手写数字识别环境准备数据集模型选择模型训练可视化展示 环境准备 本系列基于Jupyter notebook,使用Python3.7.12,Pytorch1.7.0cu110,torchvision0.8.0&…

【二等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「冀科数字」解题思路

第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…

Android10 SystemUI系列(一)概述

一、前言 由于笔者之前负责过SystemUI,之前没有抽空把很多东西整理出来,趁着最近不太忙,就慢慢动手梳理一下,顺便把自己遇到的问题也整理一下,当然自己之前主要看的是android11 之后的源码。这次主要是Android10 的源码,当然原理大差不差,也算是自己沉淀一下了 二、Sy…

Github 下载指定文件夹(git sparse-checkout)

比如要下载这里的 data_utils 步骤 1、新建空文件夹,并进入新建的空文件夹。 2、git init 初始化 3、git remote add origin 添加远程仓库 4、git config core.sparsecheckout true 允许稀疏检出 5、git sparse-checkout set 设置需要拉取的文件夹(可…

面试问题记录一 --- C++(Qt方向)

以下是我于2023年6~7月间换工作时遇到的面试题目,有需要的小伙伴可以参考下。约100个题目。 1 C和C++的区别 1) 文件区别:C源文件后缀 .c;C++源文件后缀 .cpp 2) 返回值: C默认返回int型;C++ 若无返回值,必须指定为void 3) 参数列表:C默认接收多个…

zookeeper-3.6.4集群搭建

1、上传zookeeper安装包并解压 上传路径:/opt/software/ 解压路径:/opt/module/ 2、创建数据目录及日志目录 #数据目录:/data/zookeeper/data/ #3台机器创建存储目录: sudo mkdir -p /data/zookeeper/data#日志目录&#xff1a…

Docker Desktop 设置镜像环境变量

点击run 展开Optional settings container name :容器名称 Ports:根据你需要的端口进行输入,不输入则默认 后面这个 比如我这个 5432 Volumes:卷,也就是做持久化 需要docker 数据保存的地方 Environment variables…

Mysql中having语句与where语句的用法与区别

分析&回答 我们在写sql语句的时候,经常会使用where语句,很少会用到having,其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别。having子句在查询过程中慢于聚合语句(sum,min,max,avg,count)。而where子句在查询过程中则快于聚合语句(sum,min,max,avg…

解决C++ 遇笔试题输入[[1,2,3,...,],[5,6,...,],...,[3,1,2,...,]]问题

目录 0 引言1 思路2 测试结果3 完整代码4 总结 0 引言 现在面临找工作问题,做了几场笔试,遇到了一个比较棘手的题目就是题目输入形式如下: [ [3,1,1], [3,5,3], [3,2,1] ] 当时遇到这个问题还是比较慌的,主要是之前没有遇到这样的…

【STM32】锁存器

问题背景 在学习FSMC控制外部NOR存储器时,看到在NOR复用接口模式下,AD信号[15:0]是复用的。也就是说,若不使用锁存器:当NADV为低时,ADx(x0…15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。若使用…

9.3.3网络原理(网络层IP)

一.报文: 1.4位版本号:IPv4和IPv6(其它可能是实验室版本). 2.4位首部长度:和TCP一样,可变长,带选项,单位是4字节. 3.8位服务类型 4.16位总长度:IP报头 IP载荷 传输层是不知道载荷长度的,需要网络层来计算. IP报文 - IP报头 IP载荷 TCP报文 TCP载荷 IP载荷(TCP报文) …