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

news2024/11/17 3:40:56

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

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

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

相关文章

USART串口外设

USART介绍 USART:另外我们经常还会遇到串口,叫UART,少了个S,就是通用异步收发器,一般我们串口很少使用这个同步功能,所以USART和UART使用起来,也没有什么区别。 其实这个STM32的USART同步模式&a…

MySQL 索引的使用

本篇主要介绍MySQL中索引使用的相关内容。 目录 一、最左前缀法则 二、索引失效的场景 索引列运算 字符串无引号 模糊查询 or连接条件 数据分布 一、最左前缀法则 当我们在使用多个字段构成的索引时(联合索引),需要考虑最左前缀法则…

基于物理的分析模型,用于具有场板结构的GaN HEMT的输入、输出及反向电容

Physics-Based Analytical Model for Input, Output, and Reverse Capacitance of a GaN HEMT With the Field-Plate Structure(TPE 17年) 摘要 该论文提出了一种分析模型,用于描述带有场板结构的常开型AlGaN/GaN高电子迁移率晶体管&#x…

多屏多机同控!天途首发瑶光智控地面站

瑶光智控地面站全新发布!高性能处理器,高亮三屏显示。内置天途云控系统,融合图传、控制、存储和数据处理等功能与一体,强大算力,高度集成无人机、无人船、无人车和机械狗等多种无人装备进行云控云算。 内置4G公网通讯模…

RabbitMQ-发布/订阅模式

1、发布/订阅模式介绍 在普通的生产者、消费者模式,rabbitmq会将消息依次传递给每一个消费者,一个worker一个,平均分配,这就是Round-robin调度方式,为了实现更加复杂的调度,我们就需要使用发布/订阅的方式…

现货白银的交易时间有多连贯?

国际市场上的现货白银优势很多,它除了具备国内同类型品种所不具备的数十倍资金杠杆外,也基本上实现了全天24小时不间断的交易时间,所以投资者可以在全天候连贯的行情中,寻找属于自己的交易获利机会。 但对于内地的投资者来说&…

【香橙派 AIpro】新手保姆级开箱教程:Linux镜像+vscode远程连接

香橙派 AIpro 开发板 AI 应用部署测评 写在最前面一、开发板概述官方资料试用印象适用场景 二、详细开发前准备步骤1. 环境准备2. 环境搭建3. vscode安装ssh插件4. 香橙派 AIpro 添加连接配置5. 连接香橙派 AIpro6. SSH配置 二、详细开发步骤1. 登录 juypter lab2. 样例运行3. …

HQChart使用教程100-uniapp如何在vue3运行微信小程序

HQChart使用教程100-uniapp如何在vue3运行微信小程序 症状原因分析解决思路解决步骤1. 修改vender.js2. 修改HQChartControl.js 完整实例HQChart代码地址 症状 HQChart插件在uniappvue3的项目编译成小程序以后, 运行会报错,见下图。 原因分析 查了下…

从了解到掌握 Spark 计算框架(二)RDD

文章目录 RDD 概述RDD 组成RDD 的作用RDD 算子分类RDD 的创建1.从外部数据源读取2.从已有的集合或数组创建3.从已有的 RDD 进行转换 RDD 常用算子大全转换算子行动算子 RDD 算子综合练习RDD 依赖关系窄依赖宽依赖宽窄依赖算子区分 RDD 血统信息血统信息的作用血统信息的组成代码…

【C语言回顾】预处理

前言1. 简单概要2. 预处理命令讲解结语 上期回顾: 【C语言回顾】编译和链接 个人主页:C_GUIQU 归属专栏:【C语言学习】 前言 各位小伙伴大家好!上期小编给大家讲解了C语言中的编译和链接,接下来我们讲解一下预处理! …

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的,也可以是集群作用域的…

接口测试工具:Postman的下载安装及使用

1 Postman 介绍 1.1 Postman 是什么 Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具 做 WEB 页面开发和测试的人员常用工具 创建和发送任何的 HTTP 请求(Get/Post/Put/Delete...) 1.2 Postman 相关资源 1.2.1 官方网站:https://www.postman.com/ …

算法(七)插入排序

文章目录 插入排序简介代码实现 插入排序简介 插入排序(insertion sort)是从第一个元素开始,该元素就认为已经被排序过了。然后取出下一个元素,从该元素的前一个索引下标开始往前扫描,比该值大的元素往后移动。直到遇到比它小的元…

【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色

效果图 新建activityScrollTop.js作为mixins export default {data() {return {navBgColor: "rgba(0,0,0,0)", // 初始背景颜色为完全透明navTextColor: "rgba(0,0,0,1)", // 初始文字颜色};},onPageScroll(e) {// 设置背景const newAlpha Math.min((e.s…

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester(补全建议) Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能,引导用户在输入时找到相关结果,提高搜索精度。 理想情况下,自动补…

手机站怎么推广

随着手机的普及和移动互联网的快速发展,越来越多的人开始使用手机进行在线购物、社交娱乐、阅读资讯等,同时也催生了越来越多的手机站的出现。但是,在海量的手机站中,要让自己的手机站脱颖而出,吸引更多用户访问和使用…

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸(β-Nicotinamide mononucleotide,NMN)是一种生物活性分子,是一种辅酶Ⅰ(NAD)的前体,也是…

Python魔法之旅-魔法方法(04)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Idea的相关操作

1、关闭自动更新 点击左上角File->Setting,进入配置页面,点击Appearance & Behavior > System Settings > Updates,取消勾选更新选项,如图; 2、代码提示忽略大小写 点击左上角File->Setting&#xf…

Llama 3-V: 比GPT4-V小100倍的SOTA

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模…