pdf拆分成有图和无图的pdf(方便打印)

pdf拆分成有图和无图的pdf(方便打印)

原因

打印图片要彩印,每次都要手动弄,打印的时候很麻烦;
随着打印次数的增加,时间就越来越多
为解决此问题,使用python写一个exe解决这个问题





历程

  • 找一个python的GUI界面
  • 找到 tkinter
  • 寻找拖拽文件的依赖 tkinterdnd2
  • 找打包python打包成exe的 pyinstaller 依赖
  • 打包异常,移除tkinter图标
  • tkinterdnd2打包exe运行异常,移除tkinterdnd2
  • 使用windnd替换tkinterdnd2 实现文件拖拽
  • 文件太宽采用A3打印,所以扩展输出类型
  • 打包文件 pyinstaller --onefile --windowed --icon=pdf.ico .\ChangePDF.py打包





exe

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述







源码

'''
@Author: Jeff.zheng
@Date : 2024/5/28
@Desc : 读取PDF,拆分成两个有图像和无图像的文件;
'''
import os
import shutil
import tkinter as tk
import fitz
import windnd# 输入
def readPDF(pdfPath):fileName = os.path.splitext(os.path.basename(pdfPath))[0]pdfDoc = fitz.open(pdfPath)picturePDFA4 = fitz.open()picturePDFA3 = fitz.open()wordPDF = fitz.open()for pageNum in range(len(pdfDoc)):# 选择当前页page = pdfDoc[pageNum]image_list = page.get_images(full=True)  # 获取页面上所有图片的信息# 检查是否有图片if image_list:print(f"Page {pageNum + 1} contains images.")width = page.rect.widthprint(f"{pageNum + 1} 宽度==>", width)if width > 700:print("A3")picturePDFA3.insert_pdf(pdfDoc, from_page=pageNum, to_page=pageNum)else:print("A4")picturePDFA4.insert_pdf(pdfDoc, from_page=pageNum, to_page=pageNum)else:wordPDF.insert_pdf(pdfDoc, from_page=pageNum, to_page=pageNum)print(f"Page {pageNum + 1} does NOT contain images.")if len(picturePDFA4) > 0 or len(wordPDF) > 0 or len(picturePDFA3) > 0:initDir()if len(picturePDFA4) > 0:writePDF(picturePDFA4, "图片_A4_" + fileName)root.after(2000, initLabel)if len(picturePDFA3) > 0:writePDF(picturePDFA3, "图片_A3_" + fileName)root.after(2000, initLabel)if len(wordPDF) > 0:writePDF(wordPDF, "文字_A4_" + fileName)root.after(2000, initLabel)def initLabel():changeLabel(label, "拖拽PDF完成拆分 \n1.拆分成有图片和无图片的PDF \n2.输出文件在桌面或者Destop", "black")def initDir():needPath = os.path.join(os.path.expanduser("~"), "Desktop") + '\\pdf-拆分文件'if not os.path.exists(needPath):os.makedirs(needPath)else:try:shutil.rmtree(needPath)os.makedirs(needPath)print(f"{needPath} 已被成功删除。")except OSError as e:print(f"删除{needPath}时发生错误: {e.strerror}")# 输出
def writePDF(pdfFile, pdfName):needPath = os.path.join(os.path.expanduser("~"), "Desktop") + '\\pdf-拆分文件'savePath = os.path.join(needPath, f"{pdfName}.pdf")pdfFile.save(savePath)pdfFile.close()  # 关闭新文档def draggedFiles(files):filePath = '\n'.join((item.decode('gbk') for item in files))fileType = os.path.splitext(os.path.basename(filePath))[1].lower()if fileType == '.pdf':readPDF(filePath)changeLabel(label, "导入完成\n", "green")else:changeLabel(label, "导入失败\n 1.请导入PDF,不支持其他格式\n 2.检查格式,请重新拖放文件 \n", "red")def changeLabel(myLabel, text, fg):myLabel.config(text=text)myLabel.config(fg=fg)  # 绿色if __name__ == '__main__':root = tk.Tk()root.title("PDF拆分(jeff.zheng制作)")root.geometry("400x400")# 调用函数创建居中文本的Labeltext = "拖拽PDF完成拆分 \n1.拆分成有图片和无图片的PDF \n2.输出文件在桌面或者Destop"frame = tk.Frame(root, padx=10, pady=10)  # 创建一个带有内边距的Frame以帮助居中frame.pack(fill=tk.BOTH, expand=True)  # 让Frame填充父容器并扩展# 计算Frame的宽度和高度,以便根据这些尺寸来定位Labelframe.update_idletasks()  # 确保frame尺寸已经计算label = tk.Label(frame, text=text, justify=tk.LEFT, anchor='w')  # 设置文本左对齐label.place(relx=0.5, rely=0.5, anchor='center')  # 使用place定位,通过relx和rely实现垂直居中windnd.hook_dropfiles(root, func=draggedFiles)# 运行Tkinter事件循环root.mainloop()





exe下载地址

https://download.csdn.net/download/qq_44309969/89380597

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

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

相关文章

GPT注册、手机验证码、侧边栏、翻译、绘图和视频的安装与使用

侧边栏 下面这个侧边栏收费 效果不错 ## chrome自动翻译 沉浸式翻译效果最好,支持视频 沉浸式翻译 微软网页 https://designer.microsoft.com/image-creator https://www.yeschat.ai/zh-CN/assistants 字节AI网页 https://www.coze.com/store GPT注册 https:…

qt+ffmpeg 实现音视频播放(四)之音视频同步

在处理音视频数据时,解码音频的数据往往会比解码视频的数据比较慢,所以我们在播放音视频时,音频和视频的数据会出现渐渐对不上的情况。尤其在播放时间越长的时候,这种对不上的现象越明显。 为了解决这一问题,人们想出…

数据挖掘综合案例-家用热水器用户行为分析与事件识别

文章目录 1. 背景与挖掘目标2. 分析方法与过程3. 数据分析3.1 数据探索分析3. 2 数据预处理1. 属性约束2. 划分用水事件3. 确定单次用水事件时长阈值4. 属性构造5.筛选候选洗浴事件 3.3 模型构建3.4 模型检验 4. 思考总结 1. 背景与挖掘目标 随着国内大家电品牌的进入和国外品…

探索大模型技术及其前沿应用——TextIn文档解析技术

前言 中国图象图形大会(CCIG 2024)于近期在西安召开,此次大会将面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界同仁,搭建一个展示创新成果、展望未来发展,集高度、深度、广度三位…

Django 传递额外参数给视图函数

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等,可以从前言给出的下载信息下载,大家可以评估一下。 在Django框架中,URLconf模块还支持一种传递额外参数给视图函…

【前端Vue3】——JQuery知识点总结(超详细)

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门知识专栏:🎇【MySQL&#…

IDEA一键启动多个微服务

我们在做微服务项目开发的时候,每次刚打开IDEA,就需要把各个服务一个个依次启动,特别是服务比较多时,逐个点击不仅麻烦还费时。下面来说一下如何一键启动多个微服务。 操作步骤 点击Edit Configurations 2.点击“”,…

华为S5700交换机版本升级步骤

在用一台华为交换机。由于需要做目的镜像接口,在配置过程中超过一个双向流量观察口就会报错。从官方文档查到可以升级版本解决。记录一下升级过程。 首先确定设备型号S5700-28C-EI,系统版本: VRP (R) software, Version 5.150 (S5700 V200R00…

数学建模 —— 层次分析法(2)

目录 一、层次分析法(AHP) 二、构造比较判断矩阵 2.1 两两比较法 三、单准则下的排序及一致检验 3.1 单准则下的排序 3.2 一致性检验 四、层次总排序 4.1 层次总排序的步骤 4.2 总排序一致性检验 一、层次分析法(AHP) 方…

Nginx 1.26.0 爆 HTTP/3 QUIC 漏洞,建议升级更新到 1.27.0

据悉,Nginx 1.25.0-1.26.0 主线版本中涉及四个与 NGINX HTTP/3 QUIC 模块相关的中级数据面 CVE 漏洞,其中三个为 DoS 攻击类型风险,一个为随机信息泄漏风险,影响皆为允许未经身份认证的用户通过构造请求实施攻击。目前已经紧急发布…

Solidworks 提取模型中的零件,并组合成一个新的零件,放入特征库

对方发来一个STP文件,其中有模型的部分零件想为我所用。 Shift键鼠标左键 选取需要的零件 在选好零件上右键,选择“孤立” 左边找到部件,ctrl左键选中,选择“插入到新零件” 点 绿色 勾 就选择保存类型,完成 。 打开这…

python入门3

文章目录 前言一、函数为什么要使用函数?函数定义函数定义和调用定义函数返回值定义空函数函数参数传递传递实参位置实参关键词实参默认值实参等效函数调用实参可选传递任意数量的实参任意数量关键字实参任意参数*与** 的区别使用元组和字典传参如果既有实参又有任意…

liunx配置网络的命令

liunx配置网络的命令 文章目录 liunx配置网络的命令ifconfig命令查看路由表信息netstat命令ss命令lsof命令ping 命令nslookup命令 ifconfig命令 ifconfig:显示正在工作的网卡&#xff0c;启动的设备 ifconfig -a 展示所有设备 ens33: flags4163<UP,BROADCAST,RUNNING,MUL…

教育小程序的性能优化:从前端到后端的综合提升策略

随着教育小程序的普及&#xff0c;其性能直接影响用户体验和教学效果。本文将从前端到后端&#xff0c;详细探讨教育小程序的性能优化策略&#xff0c;帮助开发者打造高效、流畅的教育应用。 一、前端性能优化策略 代码优化 减少HTTP请求&#xff1a;合并CSS、JavaScript文件…

工业相机识别电路板元器件:彩色与黑白的区别

工业相机用于识别电路板上的元器件时&#xff0c;选择彩色相机或黑白相机取决于具体应用需求和条件。彩色相机能提供更丰富的信息&#xff0c;但处理复杂度较高&#xff1b;黑白相机则在处理速度和精度上具有优势。理解它们的区别和各自的优缺点&#xff0c;有助于在具体项目中…

docker安装ubtuntu

☆ 问题描述 纯新手在docker desktop 中安装ubuntu ★ 解决方案 1. 拉取镜像 docker pull ubuntu2.查看镜像是否拉取成功 docker images3. 运行容器 docker run -itd --name <容器名称> ubuntu4. 通过 exec 命令进入 ubuntu 容器 docker exec -it <容器名>…

MyBatis3.4全集笔记

MyBatis 1. MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Ja…

亿级流量系统架构设计与实战

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

微软云计算Windows Azure(一)

目录 一、微软云计算平台二、微软云操作系统Windows Azure&#xff08;一&#xff09;Windows Azure概述&#xff08;二&#xff09;Windows Azure计算服务&#xff08;三&#xff09;Windows Azure存储服务&#xff08;四&#xff09;Windows Azure Connect&#xff08;五&…

STM 32_HAL_SDIO_SD卡

STM32的SDIO&#xff08;Secure Digital Input Output&#xff09; 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信&#xff0c;支持多媒体卡&#xff08;MMC卡&#xff09;、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…