用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中父子组件的传值问题

父子组件传值 在Vue3中如果想对子组件进行传值操作,则需要首先在const中定义多个响应式参数,必须记住的是,定义了响应式参数之后一定要在setup中return该参数,否则上面的template中不会识别,然后在template中定义 &l…

如何實現Apache HTTPS正向代理?

Apache是一款開源的、可高度定制的HTTP伺服器軟體,它位於客戶端和目標伺服器之間,用於從目標伺服器獲取資訊並將其返回給客戶端。它能提供各種功能,包括安全性、隱私性和數據壓縮。其中代理模組能夠支持正向代理和反向代理兩種模式。 而正向…

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

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

【蓝桥杯每日一题】4.8 公约数

题目来源&#xff1a; 4199. 公约数 - AcWing题库 问题描述&#xff1a; ​ 找到最大整数x&#xff0c;需满足下面两个条件 x x x是 a a a, b b b的公约数 l < x < r l<x<r l<x<r 思路&#xff1a; 找到 a a a, b b b两个数的最大公约数 g c g c d (…

Python模块导入机制详解

大家好&#xff01;今天我们要一起踏上一段Python编程的奇妙旅程&#xff0c;探索那个神秘的“import”命令&#xff0c;就像在海盗宝藏地图上寻找隐藏的金币。你准备好跟着我深入学习Python模块的进口大法了吗&#xff1f; 首先&#xff0c;你知道吗&#xff1f;在Python中&a…

【c++leetcode】1. Two Sum

问题入口 遍历一遍哈希表: O(n) class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> numMap;for (int i 0; i < nums.size(); i){int complement target - nums[i];if(numMap.count(complemen…

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

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

在linux服务器上使用tcmalloc监控java应用内存

在centOS系统中 1.安装sudo yum install gperftools-libs 2.查看安装位置rpm -ql gperftools-libs 3.使用shell脚本启动 export HEAPPROFILE./heap.log &#xff08;tcmalloc监控的日志&#xff09; export HEAP_PROFILE_ALLOCATION_INTERVAL104857600 export LD_PRELOAD/…

安装 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即可

详解Vue3中如何使用动态组件

在 Vue 3 中,动态组件是一种允许在运行时动态切换组件的机制,本文主要为大家详细介绍了动态组件在Vue3中的具体使用。 Vue 3 提供了 元素以及 is 特性来实现动态组件的切换。 一、使用元素 在模板中使用 元素&#xff0c;通过 is 特性来动态切换组件&#xff1a; <templat…

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

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