用Tkinter制作一个用于合并PDF文件的小程序

需要安装PyPDF2库,具体原代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 29 14:44:20 2024@author: YBK
"""import PyPDF2
import os
import tkinter as tk 
import windndpdf_files = []
def dragged_files(files):    if len(files) > 1:for item in files:pdf_files.append(item.decode('gbk'))message.config(text='当前拖放的文件路径为:\n' + '\n'.join((file for file in pdf_files)))        else:pdf_files.append(files[0].decode('gbk'))message.config(text='当前拖放的文件路径为:\n' + '\n'.join((file for file in pdf_files))) def get_filename_without_extension(filepath):filename_with_extension = os.path.basename(filepath)filename, file_extension = os.path.splitext(filename_with_extension)return filenamedef is_pdf_file(file_path):# 使用os.path.splitext()分割文件路径和扩展名_, file_extension = os.path.splitext(file_path)# 检查扩展名是否为.pdf(注意扩展名包含点号)return file_extension.lower() == '.pdf'def on_button_click():global pdf_filesprint("生成合并的PDF文件!")output_path = os.path.dirname(pdf_files[0])outfilename = get_filename_without_extension(pdf_files[0])output_path = os.path.join(output_path,f'merged_{outfilename}.pdf')print(output_path)merge_pdfs(pdf_files, output_path)message.config(text='合成成功,当前合成PDF的文件路径为:\n' + output_path)def on_button_click0():global pdf_filespdf_files = []message.config(text='当前拖放的文件路径为:\n' + '\n'.join((file for file in pdf_files)))print("清空列表")def merge_pdfs(pdf_list, output_path):merger = PyPDF2.PdfMerger()    for pdf in pdf_list:if is_pdf_file(pdf):with open(pdf, 'rb') as f:merger.append(f)    with open(output_path, 'wb') as f:merger.write(f)if __name__ == '__main__':rootWindow = tk.Tk()rootWindow.title("按顺序拖拉PDF文件进行合并")rootWindow.geometry("400x520")message = tk.Message(rootWindow, width=400, text="当前未拖放PDF文件,请拖放文件到这里...")message.grid(row=0,columnspan=2)button0 = tk.Button(rootWindow, text="清空文件列表", command=on_button_click0)button = tk.Button(rootWindow, text="提交进行合并", command=on_button_click)# 放置按钮在主窗口上button0.grid(row=1,column=0)button.grid(row=1,column=1)windnd.hook_dropfiles(rootWindow, func=dragged_files,)rootWindow.mainloop()

运行界面:

非常实用,提高办公效率。因为现在Wps合并PDF文件需要会员,还是自己开发一个。

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

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

相关文章

CDP集成Hudi实战-Hive

[〇]关于本文 本文测试一下使用Hive和Hudi的集成 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]部署Jar包 1-部署hudi-hive-sync-bundle-1.0.0.jar文件 [rootcdp73-1 ~]# for i in $(se…

公司资产网站

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

基于FPGA的辩论赛系统设计-8名选手-正反两方-支持单选手评分-正反两方评分总和

基于FPGA的辩论赛系统设计 功能描述一、系统概述二、仿真波形视频 功能描述 1.答辩倒计时功能&#xff0c;当正反任意一方开始答辩后&#xff0c;倒计时30S。在倒计时最后10S后&#xff0c;LED灯开始闪烁。 2.答辩评分和计分功能&#xff0c;当答辩方结束答辩后&#xff0c;评…

【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析

文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…

打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet

一、引言 1.1 研究背景与意义 在现代医疗领域,医学影像作为疾病诊断与治疗的关键依据,发挥着不可替代的作用。从传统的X射线、CT(计算机断层扫描)到MRI(磁共振成像)等先进技术,医学影像能够直观呈现人体内部结构,为医生提供丰富的诊断信息,涵盖疾病识别、病灶定位、…

计算机缺失x3daudio1 7.dll怎么修复?

电脑运行时常见问题解析与修复策略&#xff1a;以“x3daudio1_7.dll缺失”为例 在软件开发与日常电脑维护的广阔领域中&#xff0c;我们时常会遇到各种系统报错和文件问题。这些问题不仅影响我们的工作效率&#xff0c;还可能对数据安全构成潜在威胁。作为一位经验丰富的软件开…

WPF区域导航+导航参数使用+路由守卫+导航日志

背景&#xff1a;使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的&#xff0c;不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel&#xff1a; private object body;public object Body {get { retu…

通过纯文字引导DeepSeek编写一个简单的聊天机器人~

为进一步验证DeepSeek的代码能力 和 自然语言理解力&#xff0c;我花费了大约1个半小时的时间&#xff0c;和DeepSeek仅通过文字对话&#xff0c;编写出一个简单的聊天机器人。 以下是最终运行效果、生成代码、引导沟通过程示例&#xff1a; 一、最终运行效果&#xff1a; 二…

C/C++中new/delete与malloc/free的区别及对象管理

C/C++中new/delete与malloc/free的区别及对象管理 在C/C++编程中,动态内存管理是一个核心且复杂的话题,其中new、delete、malloc和free是四个经常用于此目的的工具。尽管它们都涉及到内存的分配和释放,但它们在处理对象时的方式和效果却大相径庭。本文将通过示例来说明这些工…

安卓入门十一 常用网络协议四

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09; MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下&#xff0c;实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式&#xff1a;MQTT 使用发布/订…

ansible-Ad-hoc命令行模式

一. 简述&#xff1a; ansible的ad-hoc是一个概念性的名字&#xff0c;是相对于ansible playbook而言。类似于&#xff1a;通过命令行来执行一些简单的&#xff0c;一次性的playbook任务(通俗点就是通过命令行执行一些简单的,而又不需要将命令特殊保存起来的任务)。Ansible提供…

UE5AI感知组件

官方解释&#xff1a; AI感知系统为Pawn提供了一种从环境中接收数据的方式&#xff0c;例如噪音的来源、AI是否遭到破坏、或AI是否看到了什么。 AI感知组件&#xff08;AIPerception Component&#xff09;是用于实现游戏中的非玩家角色&#xff08;NPC&#xff09;对环境和其…

[SAP ABAP] SMARTFORMS表单开发

使用事务码SMARTFORMS进入到SMARTFORMS开发界面进行表单开发 SMARTFORMS表单开发相关资料 [SMARTFORMS] 创建样式模板https://blog.csdn.net/Hudas/article/details/144946341?spm1001.2014.3001.5501[SMARTFORMS] 创建FORMhttps://blog.csdn.net/Hudas/article/details/144…

倍思氮化镓充电器分享:Super GaN伸缩线快充35W

快节奏的时代,在旅游、办公等场景下,一款高效、便捷的充电器可以让我们的生活更便捷、高效。今天就给大家推荐一款倍思氮化镓充电器——Super GaN伸缩线快充35W。它具备多重亮点,可以满足我们在许多场景下的充电需求,成为我们的得力助手。 倍思氮化镓Super GaN伸缩线快充35W的亮…

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码&#xff0c;采样率为44100HZ, 每帧1024采样&#xff0c;帧率43&#xff0c;23.2ms一帧 RTC中一般音频采用opus编码&#xff0c;采样率为48000HZ&#xff0c;每帧480采样&#xff0c;帧率100&#xff0c;10ms一帧 通道数&#xff08;c…

xr-frame 通过shader去除视频背景色,加载透明视频

目录 前言 实现思路 获取 XR 框架系统&#xff1a; 注册自定义效果 创建效果对象 渲染通道配置 着色器代码 顶点着色器 片元着色器&#xff08;颜色分量g达到条件的片元将被透透明&#xff09; effect-removeBlack 完整代码 wxml中使用 前言 实现了一个用于注册自定…

fnm教程

常用命令 // 查看所有远程可供安装的 Node 版本 fnm list-remote// 安装某一 Node 版本 fnm install <version>// 切换某一 Node 版本 fnm use <version>// 查看当前使用的 Node 版本 fnm current// 查看所有已安装的 Node 版本 fnm list// 删除某一 Node 版本 fn…

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

接口测试Day06-UnitTest框架

UnitTest 是开发人员用来实现 “单元测试” 的框架。测试工程师&#xff0c;可以在自动化 “测试执行” 时使用。 使用 UnitTest 的好处&#xff1a; 方便管理、维护测试用例。提供丰富的断言方法。生成测试报告。&#xff08;需要插件 HTMLTestReport&#xff09; UnitTest框架…