当前位置: 首页 > news >正文

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

相关文章:

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

pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印,每次都要手动弄,打印的时候很麻烦; 随着打印次数的增加,时间就越来越多 为解决此问题,使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…...

通用树查找算法

想要一个树形控件来显示数据,却发现Racket的GUI库竟然没有提供这个控件。既然没有,那就自己手搓一个吧。没想到,在做这个控件中竟然有了新发现! 树形控件有一个功能是查找树中指定的节点。这就是接下来的故事的起点。 1 找外援 不…...

Flutter 中的 TableCell 小部件:全面指南

Flutter 中的 TableCell 小部件:全面指南 Flutter 是一个功能强大的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,TableCell 是一个用于创建表格单元格的组件…...

clickhouse学习笔记(一)入门与安装

目录 一 、入门 简介 核心特性包括 1.1 列式存储 1.2 原生压缩 1.3 向量化执行引擎 1.4 DBMS 功能 1.5 分布式处理 1.6 高吞吐写入能力 1.7 实时分析 1.8 SQL支持 1.9 高度可扩展 1.10 数据分区与线程级并行 1.11 应用场景 1.12 不适用场景 二、ClickHouse单机版…...

【JavaEE精炼宝库】多线程(4)深度理解死锁、内存可见性、volatile关键字、wait、notify

目录 一、死锁 1.1 出现死锁的常见场景: 1.2 产生死锁的后果: 1.3 如何避免死锁: 二、内存可见性 2.1 由内存可见性产生的经典案例: 2.2 volatile 关键字: 2.2.1 volatile 用法: 2.2.2 volatile 不…...

使用Ollama+OpenWebUI部署和使用Phi-3微软AI大模型完整指南

🏡作者主页: 点击! 🤖AI大模型部署与应用专栏:点击! ⏰️创作时间:2024年6月6日23点50分 🀄️文章质量:96分 欢迎来到Phi-3模型的奇妙世界!Phi-3是由微软…...

k8s的ci/cd实践之旅

书接上回k8s集群搭建完毕,来使用它强大的扩缩容能力帮我们进行应用的持续集成和持续部署,整体的机器规划如下: 1.192.168.8.156 搭建gitlab私服 docker pull gitlab/gitlab-ce:latest docker run --detach --hostname 192.168.8.156 --publ…...

笔记96:前馈控制 + 航向误差

1. 回顾 对于一个 系统而言,结构可以画作: 如果采用 这样的控制策略,结构可以画作:(这就是LQR控制) 使用LQR控制器,可以通过公式 和 构建一个完美的负反馈系统; a a 但是有上…...

延时任务工具类

自定义工具类 package com.sxfoundation.task;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.task.TaskRejectedException; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.spri…...

springboot下载grpc编译文件,报错缺少protoc-gen-grpc-java:1.34.1:exe不存在

报错如图所示 [ERROR] Then, install it using the command: [ERROR] mvn install:install-file -DgroupIdio.grpc -DartifactIdprotoc-gen-grpc-java -Dversion1.34.1 -Dclassifierwindows-x86_64 -Dpackagingexe -Dfile/path/to/file [ERROR] [ERROR] Alternatively, if yo…...

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较 一、引言二、非关系型数据库(NoSQL)2.1 优势 三、关系型数据库(RDBMS)3.1 优势 四、结论 💖The Begin…...

JAVA学习-练习试用Java实现“简化路径”

问题: 给定一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 / 开头),请将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身…...

STM32——ADC篇(ADC的使用)

一、ADC的介绍 1.1什么是ADC ADC(Analogto-Digital Converter)模拟数字转换器,是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号,单片机无法直接采集,此时需要ADC先将短租两端的电…...

(文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略

参考文献: [1]潘虹锦,高红均,杨艳红,等.基于主从博弈的售电商多元零售套餐设计与多级市场购电策略[J].中国电机工程学报,2022,42(13):4785-4800. 1.摘要 随着电力市场改革的发展,如何制定吸引用户选择的多类型零售套餐成为提升售电商利润的研究重点。为…...

深度评价GPT-4o:探索人工智能的新里程碑

在人工智能领域,OpenAI的GPT系列自推出以来就备受瞩目。GPT-4o作为该系列的最新版本,无疑是迄今为止最为强大的一代。它不仅在技术性能上有了质的飞跃,而且在应用的广泛性和深度上都展现出了惊人的潜力。本文将从版本对比、技术能力、使用体验…...

Linux命令篇(六):vi/vim专项

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝您生活愉快! 文章目录 一、什么是vim二…...

Java 还能不能继续搞了?

金三银四招聘季已落幕,虽说行情不是很乐观,但真正的强者从不抱怨。 在此期间,我收到众多小伙伴的宝贵反馈,整理出132道面试题,从基础到高级,有八股文,也有对某个知识点的深度解析。包括以下几部…...

【日记】遇到了一个很奇怪的大爷(845 字)

正文 花了昨天和今天两天时间,把数据转移完了。这块 2T 的硬盘可以光荣退休了。目前是没什么存储焦虑了。 农发行净开发一些垃圾系统。今天没什么业务,但跟 ActiveX 斗智斗勇了一整天,最后实在搞不过 IE 浏览器。我也懒得管了,又不…...

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 目录 Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 一、简单介绍 二、处理文本数据 三、用…...

GAT1399协议分析(10)--视频定义及解析

一、官方定义 二、字段解析 VideoID 类型BasicObjectID 解析参考GAT1399协议分析(8)--ImageInfo字段详解-CSDN博客 InfoKind 采集类型...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...