用Python编写GUI程序将JPEG文件按文件名顺序插入PDF文件

在Python编程中,处理文件和图像是常见的任务之一。最近,我遇到了一个有趣的问题:如何通过编写一个GUI程序来将一个文件夹中的JPEG文件按文件名顺序插入到一个新的PDF文件中?在这篇博客中,我将分享我使用Python、wxPython模块和reportlab库实现这一功能的经验。

C:\pythoncode\new\jpeg2pdf.py

 准备工作

在开始编写代码之前,我们需要安装两个Python库:wxPython和reportlab。你可以使用pip命令进行安装:

pip install wxPython reportlab

 

 编写GUI程序

首先,我们创建一个简单的GUI界面,包含一个文件夹选择器和一个创建PDF按钮。用户可以通过文件夹选择器选择包含JPEG文件的文件夹,然后点击创建PDF按钮进行操作。

import os
import wx
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.utils import ImageReaderclass PdfCreatorFrame(wx.Frame):def __init__(self, parent, title):super(PdfCreatorFrame, self).__init__(parent, title=title, size=(400, 200))self.panel = wx.Panel(self)self.folder_picker = wx.DirPickerCtrl(self.panel, message="选择要插入的文件夹",style=wx.DIRP_USE_TEXTCTRL)self.create_pdf_button = wx.Button(self.panel, label="创建PDF", size=(100, 30))self.create_pdf_button.Bind(wx.EVT_BUTTON, self.on_create_pdf)self.status_text = wx.StaticText(self.panel, label="等待选择文件夹...")self.status_text.Wrap(380)sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(self.folder_picker, 0, wx.EXPAND | wx.ALL, 10)sizer.Add(self.create_pdf_button, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 10)sizer.Add(self.status_text, 0, wx.ALIGN_CENTER | wx.ALL, 10)self.panel.SetSizer(sizer)def on_create_pdf(self, event):folder_path = self.folder_picker.GetPath()if not folder_path:self.status_text.SetLabel("请选择文件夹!")returnjpeg_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.jpg') or f.lower().endswith('.jpeg')]if not jpeg_files:self.status_text.SetLabel("文件夹中没有JPEG文件!")returnpdf_path = os.path.join(folder_path, 'output.pdf')c = canvas.Canvas(pdf_path, pagesize=letter)sorted_files = sorted(jpeg_files)for idx, jpeg_file in enumerate(sorted_files):jpeg_path = os.path.join(folder_path, jpeg_file)img = ImageReader(jpeg_path)c.setPageSize(img.getSize())c.drawImage(img, 0, 0)if idx != len(sorted_files) - 1:c.showPage()c.save()self.status_text.SetLabel("PDF文件创建成功!")if __name__ == '__main__':app = wx.App()frame = PdfCreatorFrame(None, title="JPEG插入PDF")frame.Show()app.MainLoop()

这段代码创建了一个名为`PdfCreatorFrame`的wxPython窗口类,其中包含了文件夹选择器和创建PDF按钮。当用户点击按钮时,程序会调用`on_create_pdf`方法来实现文件处理逻辑。

实现功能逻辑

在`on_create_pdf`方法中,我们首先获取用户选择的文件夹路径,并检查是否存在JPEG格式的图片文件。然后,我们使用reportlab库中的canvas类来创建一个新的PDF文件,并将文件夹中的JPEG文件按文件名顺序插入到PDF中。

   def on_create_pdf(self, event):folder_path = self.folder_picker.GetPath()if not folder_path:self.status_text.SetLabel("请选择文件夹!")returnjpeg_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.jpg') or f.lower().endswith('.jpeg')]if not jpeg_files:self.status_text.SetLabel("文件夹中没有JPEG文件!")returnpdf_path = os.path.join(folder_path, 'output.pdf')c = canvas.Canvas(pdf_path, pagesize=letter)sorted_files = sorted(jpeg_files)for idx, jpeg_file in enumerate(sorted_files):jpeg_path = os.path.join(folder_path, jpeg_file)img = ImageReader(jpeg_path)c.setPageSize(img.getSize())c.drawImage(img, 0, 0)if idx != len(sorted_files) - 1:c.showPage()c.save()self.status_text.SetLabel("PDF文件创建成功!")

 

这部分代码逻辑简单明了:遍历选定文件夹下所有的JPEG文件,将其按文件名排序并逐个插入到PDF文件中。

 测试与运行

完成代码编写后,我们可以运行程序进行测试。当程序启动后,选择包含JPEG文件的文件夹,点击创建PDF按钮,程序将会按文件名顺序将所有的JPEG文件插入到一个新的PDF文件中。

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

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

相关文章

DC-DC芯片D1509适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是芯谷科技推出的一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片,其输出电压有固定3.3V、5.0V和12.0V的版本&#xff…

网络安全行业现在还能入吗?

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入行业,能享受行业发展红利。…

【ArcPro 加载项】图层组排序子图层

最近做控规,CAD湘源用的比较多。 这里就需要再夸夸Pro3.0,对CAD和湘源的支持非常到位。顺便再鞭尸Pro3.2,规划人千万不要更新。 【ArcGIS 小贴士】Pro3.2逆向更新,不能正常显示CAD、湘源 等等,发现一个问题&#xf…

跨云迁移实操:AWS RDS for mysql 迁移至腾讯云mysql --DTS方式

实操场景:从AWS RDS for mysql 迁移至腾讯云云数据库Mysql,通过腾讯云数据传输服务DTS,进行实时全量增量迁移. 下面九河云给大家带来具体实践介绍 购买迁移数据库--目的端机器(腾讯云MYSQL) 可以源端为5.7所以新建一个参数模版 其…

常见的解析漏洞总结

文件解析漏洞 文件解析漏洞主要由于网站管理员操作不当或者 Web 服务器自身的漏洞,导致一些特殊文件被 IIS、apache、nginx 或其他 Web服务器在某种情况下解释成脚本文件执行。 比如网站管理员配置不当,导致php2、phtml、ascx等等这些文件也被当成脚本文…

回归测试覆盖率指的是什么?

定义 回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。 在软件开发过程当中,一旦软件代码做了修改,就有可能引入新的问题,所以这个时候就需要把已经完成了的验证用例重新跑一下&…

vue3+Ts+Ant Design Vue +天地图组件封装

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue3TsAntDesign-Vue组件天地图组件的封装 示例图 首先,在index.html引入天地图资源,vue3选择v4版本 <script src"http://api.tianditu.gov.cn/api?…

【Redis】NoSQL之Redis的配置和优化

关系型数据库与非关系型数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系型模型&#xff08;二维表&#xff09;的基础上&#xff1b;一般面向于记录&#xff1b; SQL语句(标准数据查询语句)就是一种基于关系型数据库的语言&#xff0c;用于执行…

安装 windows 版 dash —— zeal

1、下载安装 下载地址&#xff1a;Download Zeal 选择 Protable 版 直接使用 zeal 下载文档比较慢甚至失败&#xff0c;可以设置代理&#xff0c;也可以使用下面两种方式。 2、手动下载 docset 文档后导入 这种方法不能够选择文档的版本 &#xff08;1&#xff09;在 http://…

达梦数据库的V$DM_INI和V$PARAMETER系统视图

V$DM_INI和V$PARAMETER是达梦数据库中两个常用的系统视图&#xff0c;用于查看数据库的配置参数。这两个视图的主要区别在于它们展示参数的来源和用途。 V$DM_INI V$DM_INI视图主要用于展示数据库启动时加载的初始化参数信息。这些信息通常来自于数据库的初始化参数文件&…

自动驾驶中的传感器融合算法:卡尔曼滤波器和扩展卡尔曼滤波器

自动驾驶中的传感器融合算法&#xff1a;卡尔曼滤波器和扩展卡尔曼滤波器 附赠自动驾驶学习资料和量产经验&#xff1a;链接 介绍&#xff1a; 追踪静止和移动的目标是自动驾驶技术领域最为需要的核心技术之一。来源于多种传感器的信号&#xff0c;包括摄像头&#xff0c;雷达…

VSCode输入花括号{}}会多一个解决方案

打开设置 搜索Closing Brackets 选择BeforeWhitespace 选完后重启下VSCode即可

ddres( ) 组站星双差方程和设计矩阵

1 ddres( )参数介绍 rtklib中进行的单频解算 双差观测值&#xff0c;单差的模糊度 单频点双差 DD (double-differenced) phase/code residuals ------------------------------ x 模糊度 P 方差-协方差阵 sat 共识卫星列表 ns 共识卫星数量 y…

模型优化和调整(2)

接模型优化和调整&#xff08;1&#xff09; 调整反向传播 梯度消失和梯度爆炸 梯度消失和梯度爆炸都和计算出来的“delta”有关。理想的delta应该是逐渐减小的。如果delta一直太小&#xff0c;则会导致下降太慢&#xff0c;甚至对于权重没有改变&#xff0c;此时形成了梯度…

深入C语言内存:数据在内存中的存储

一、数据类型 1. unsigned&#xff1a;无符号数类型 当一个数是无符号类型时&#xff0c;那么其最高位的1或0&#xff0c;和其它位一样&#xff0c;用来表示该数的大小。 2.signed&#xff1a;有符号数类型 当一个数是有符号类型时&#xff0c;最高数称为“符号位”。符号位为1…

绝地求生:第29赛季第1轮更新公告

正式服维护日期 ※ 下列时间可能会视维护情况而变化。 北京时间4月9日上午8:00 – 下午4:30 地图轮换 ※ 地图轮换将于北京时间每周三上午10点进行。 日期 正式服 – 普通比赛 可自主选择地图的地区 - 亚洲、东南亚 可自主选择地图的地区 – 韩国/日本、KAKAO 随机选择地…

【随笔】Git 基础篇 -- 分支与合并 git merge(九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

重生奇迹MU玛雅宝石功能

玛雅宝石是重生奇迹mu游戏中的重要合成材料&#xff0c;玩家可以使用玛雅宝石合成属性果实、副本门票等道具。不过玛雅宝石的获取不易&#xff0c;所以使用起来一个都不能浪费。今天就给大家分享一些玛雅宝石使用效益最大化的经验。 获取与使用 在游戏中&#xff0c;玛雅宝石…

有人吐槽:低代码平台自带可视化报表,你定制化设计有啥市场?

类似这种评论&#xff0c;我见过的太多了。photoshop触手可及&#xff0c;设计高手又有几人呢&#xff1f; 工具毕竟就是工具&#xff0c;能不能用好&#xff0c;完全在于个体。 实不相瞒&#xff0c;我们接过N多可视化报表的美化业务&#xff0c;这就好比天猫有默认的店铺模…

JAVA面试八股文之Redis相关

Redis相关 Redis6.0为什么要用多线程&#xff1f;在Redis中存一个list集合怎么实现排序&#xff1f;Redis的5大基本类型的底层原理&#xff1f;缓存穿透&#xff1f;缓存击穿&#xff1f;缓存雪崩&#xff1f;redis做为缓存怎么保持和mysql数据进行同步&#xff1f;&#xff08…