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.width
            print(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")

    # 调用函数创建居中文本的Label
    text = "拖拽PDF完成拆分 \n1.拆分成有图片和无图片的PDF \n2.输出文件在桌面或者Destop"

    frame = tk.Frame(root, padx=10, pady=10)  # 创建一个带有内边距的Frame以帮助居中
    frame.pack(fill=tk.BOTH, expand=True)  # 让Frame填充父容器并扩展
    # 计算Frame的宽度和高度,以便根据这些尺寸来定位Label
    frame.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 目录 Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 一、简单介…

Linux前奏-预热版本

一、操作系统概述 1.1 了解操作系统的作用 我们所熟知的计算机,也就是电脑,就是由硬件和软件来组成的 硬件:计算机系统中由电子机械,和各种光电元件等组成的各种物理装置的总称 软件是什么呢? 软件:用…

视频汇聚平台EasyCVR对接GA/T 1400视图库结构化数据:人员/人脸、非/机动车、物品

在信息化浪潮席卷全球的背景下,公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中,GA/T 1400标准作为公安视频图像信息应用系统的核心规范,以其结构化数据处理与应用能力,为公安信息化建设注入了强大的动力。…

skywalking介绍及搭建

链路追踪框架比对: skywalking安装部署: 下载地址:Downloads | Apache SkyWalking 配置微服务与skywalking整合: copy agent/optional-plugins/apm-spring-cloud-getway-xx.jar到plugins,然后重启skywalking 监控界面…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目:https://github.com/MengYang-x/STM3F401-FOC/tree/main📍硬件电路和项目介绍,立创开源广场:https://oshwhub.com/shadow27/tai-yang-nen…

Web程序设计-实验05 DOM与BOM编程

题目 【实验主题】 影视网站后台影视记录管理页设计 【实验任务】 1、浏览并分析多个网站后台的列表页面、编辑页面(详见参考资源,建议自行搜索更多后台页面)的主要元素构成和版面设计,借鉴并构思预期效果。 2、新建 index.h…

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了,研究发现移到了左下角了,如下图所示: 上一次编辑位置快捷键: pycharm2024版 上一次编辑位置不见了,研究发现移到了左下角了,如下图所示: 上一次编辑…

在IDEA中使用Git在将多次commit合并为一次commit

案例: 我想要将master分支中的 测试一、测试二、测试三三次commit合并为一次commit 1. 点击Git 2. 双击点击commit所在的分支 3. 右键要合并的多个commit中的第一次提交的commit 4. 点击右键后弹出的菜单中的Interactively Rebase From Here选项 5. 点击测试二…

elementui el-tooltip文字提示组件弹出层内容格式换行处理

1、第一种 1.1 效果图 1.2、代码 <template><div class"wrapper"><el-tooltip class"content" effect"dark" placement"top"><div slot"content"><div v-html"getTextBrStr(text)"&…

数据可视化:解析其在现代生活中的日益重要地位

数据可视化为什么对我们的生活影响越来越大&#xff1f;这是一个值得探讨的话题。在信息化时代&#xff0c;数据无处不在&#xff0c;海量的数据不仅改变了商业模式&#xff0c;也深刻影响了我们的日常生活。数据可视化作为一种将复杂数据转化为直观图表、图形的技术&#xff0…

CLIP模型NAN问题解决

早有耳闻&#xff0c;clip模型会在fp16下发生NAN的问题&#xff0c;但是今天基于2080Ti测试&#xff0c;发现在单精度下的tensorrt推理同样存在NAN的问题&#xff0c;我甚至一度怀疑是tensorrt的推理代码有问题。 之后&#xff0c;决定从python代码的角度去寻找问题的答案&…

PostgreSQL常用插件

PostgreSQL 拥有许多常用插件&#xff0c;这些插件可以大大增强其功能和性能。以下是一些常用的 PostgreSQL 插件&#xff1a; 性能监控和优化 pg_stat_statements 1.提供对所有 SQL 语句执行情况的统计信息。对调优和监控非常有用。 2.安装和使用&#xff1a; pg_stat_k…

SOLIDWORKS参数化开发 慧德敏学

传统的设计模式下大规模定制型产品结构设计周期长&#xff0c;问题多&#xff0c;以及大量重复性工作让工程师疲于应对&#xff0c;这些严重阻碍了公司订单承接能力和技术创新能力&#xff0c;难以响应市场需求。 什么是参数化设计&#xff1f; 1、它是一种设计的方式&#x…

oracle mysql索引区别

文章目录 1.引言1.1 索引的基本概念1.2 Oracle和MySQL的简介 2.Oracle索引2.1 Oracle索引的类型**B-Tree索引****Bitmap索引****Function-Based索引****Partitioned索引****Text索引** 2.2 Oracle索引的工作原理2.3 Oracle索引的实例代码 3.MySQL索引3.1 MySQL索引的类型**B-Tr…

Linux开发工具(个人使用)

Linux开发工具 1.Linux yum软件包管理器1.1Linux安装程序有三种方式1.2注意事项1.3如何查看&#xff0c;安装&#xff0c;卸载软件包1.3.1查看软件包1.3.2安装软件包1.3.3卸载软件 2.Linux vim编辑器2.1vim的基本操作2.2vim正常模式命令集2.3vim底行模式命令集2.4vim配置 3.Lin…

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节&#xff1a; 1、SD卡分区 提示&#xff1a;我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况&#xff0c;NXP官方给的镜像布局结构如下所示&#xff1a; 可以看到&#xff0c…

微服务架构-微服务治理基础

目录 一、服务治理由来 1.1 概述 1.2 微服务治理的几个维度 1.2.1 服务定义和SLA 1.2.2 服务注册中心 1.2.3 服务生命周期管理 1.2.4 服务通信和链路治理 1.2.5 服务授权和通信安全 二、服务治理的目标与愿景 2.1 服务治理的愿景 2.2 服务治理的目标 2.2.1 标准化 …

vue3使用vue3-print-nb打印

打印效果 1.下载插件 Vue2.0版本安装方法 npm install vue-print-nb --saveVue3.0版本安装方法&#xff1a; npm install vue3-print-nb --save2.main.js引入 vue2引入 import Print from vue-print-nb Vue.use(Print)vue3引入 import print from vue3-print-nb // 打印…

css :hover的使用

参考未整理 即鼠标移入类名为btn的元素时&#xff0c;她的子元素i样式发生改变 自身的样式也发生改变 &#xff0c;如果他有更多的子元素也可以这样写

LeetCode2542最大子序列的分数

题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;两者长度都是 n &#xff0c;再给你一个正整数 k 。你必须从 nums1 中选一个长度为 k 的 子序列 对应的下标。 对于选择的下标 i0 &#xff0c;i1 &#xff0c;…&#xff0c; ik - 1 &#xff0c;你的 …