用wxPython和PyMuPDF将PNG图像合并为PDF文件

在日常工作中,我们经常需要将多个图像文件合并到一个PDF文档中,以便于查看、共享或存档。虽然现有的一些工具可以实现这一功能,但开发一个自定义的GUI工具可以更好地满足特定需求,并提供更好的用户体验。

在本文中,我将介绍如何使用Python、wxPython和PyMuPDF库创建一个简单的图形界面程序,用于将指定文件夹中的PNG图像合并为一个PDF文件。

程序概述

我们的程序包含以下主要部分:

1. **wxPython GUI** - 提供用户界面,包括文件选择器、图像预览和文件列表控件。
2. **PyMuPDF库** - 用于创建和操作PDF文件,将PNG图像插入到PDF页面中。
3. **Python文件操作** - 用于遍历文件夹和获取文件信息。

下面是程序的用户界面截图:

使用步骤:

1. 运行程序后,选择包含PNG图像的文件夹
2. 在左侧的列表框中,所有PNG文件名将被列出。单击任一文件名,右侧区域会显示该图像的预览。
3. 选中要合并到PDF中的PNG文件,点击">>"按钮将其移动到右侧列表框中。
4. 点击"生成PDF"按钮,选择PDF文件的保存路径。
5. 程序将按照右侧列表框中的顺序,将PNG图像合并到一个新的PDF文件中。
6. 合并完成后,会弹出一个对话框,显示PDF文件的保存路径。

C:\pythoncode\new\pngToPdf.py

代码解析

import os
import wx
import fitz  # PyMuPDF库class PDFMergeApp(wx.App):def __init__(self):super().__init__()self.frame = PDFMergeFrame(None)self.frame.Show()class PDFMergeFrame(wx.Frame):def __init__(self, parent):super().__init__(parent, title="PDF合并工具")panel = wx.Panel(self)# 创建控件self.dir_picker = wx.DirPickerCtrl(panel, message="选择PNG文件夹")self.list_box1 = wx.ListBox(panel, style=wx.LB_SINGLE)self.picture = wx.StaticBitmap(panel)self.list_box2 = wx.ListBox(panel, style=wx.LB_EXTENDED)move_btn = wx.Button(panel, label=">>")generate_btn = wx.Button(panel, label="生成PDF")# 绑定事件处理函数self.dir_picker.Bind(wx.EVT_DIRPICKER_CHANGED, self.update_list_box1)self.list_box1.Bind(wx.EVT_LISTBOX, self.display_image)move_btn.Bind(wx.EVT_BUTTON, self.move_to_list_box2)generate_btn.Bind(wx.EVT_BUTTON, self.generate_pdf)# 布局sizer = wx.BoxSizer(wx.HORIZONTAL)left_sizer = wx.BoxSizer(wx.VERTICAL)right_sizer = wx.BoxSizer(wx.VERTICAL)left_sizer.Add(self.dir_picker, 0, wx.EXPAND | wx.ALL, 5)left_sizer.Add(self.list_box1, 1, wx.EXPAND | wx.ALL, 5)right_sizer.Add(self.picture, 1, wx.EXPAND | wx.ALL, 5)right_sizer.Add(self.list_box2, 1, wx.EXPAND | wx.ALL, 5)right_sizer.Add(generate_btn, 0, wx.ALIGN_CENTER | wx.ALL, 5)sizer.Add(left_sizer, 1, wx.EXPAND | wx.ALL, 5)sizer.Add(move_btn, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)sizer.Add(right_sizer, 1, wx.EXPAND | wx.ALL, 5)panel.SetSizer(sizer)def update_list_box1(self, event):self.list_box1.Clear()dir_path = self.dir_picker.GetPath()for filename in os.listdir(dir_path):if filename.endswith(".png"):self.list_box1.Append(filename)def display_image(self, event):selection = event.GetSelection()filename = self.list_box1.GetString(selection)dir_path = self.dir_picker.GetPath()image = wx.Image(os.path.join(dir_path, filename), wx.BITMAP_TYPE_PNG)self.picture.SetBitmap(wx.Bitmap(image))def move_to_list_box2(self, event):selections = self.list_box1.GetSelections()items = [self.list_box1.GetString(sel) for sel in selections]for item in items:self.list_box2.Append(item)self.list_box1.Delete(self.list_box1.FindString(item))def generate_pdf(self, event):dir_path = self.dir_picker.GetPath()pdf_path = wx.FileSelector("保存PDF文件", wildcard="PDF 文件 (*.pdf)|*.pdf",flags=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)if pdf_path:pdf = fitz.open()for index in range(self.list_box2.GetCount()):filename = self.list_box2.GetString(index)image_path = os.path.join(dir_path, filename)img = fitz.Pixmap(image_path)page = pdf.new_page(width=img.width, height=img.height)page.insert_image(rect=page.rect, pixmap=img)pdf.save(pdf_path)pdf.close()wx.MessageBox(f"已成功生成PDF文件: {pdf_path}", "完成", wx.OK | wx.ICON_INFORMATION)
if __name__ == "__main__":app = PDFMergeApp()app.MainLoop()

这段代码的核心在于wxPython GUI的构建和PyMuPDF库的使用。

在创建GUI时,我们定义了各种控件,如文件夹选择器、列表框和图像预览区域,并将它们合理布局。通过事件绑定,实现了不同控件的交互功能,例如选择文件夹后更新文件列表、预览图像、在列表框之间移动文件等。

合并PNG到PDF的关键是使用PyMuPDF库。我们遍历右侧列表框中的PNG文件路径,使用`fitz.Pixmap`打开每个PNG图像。然后,为每个图像创建一个新的PDF页面,并使用`page.insert_image`方法将图像插入到该页面中。最后,将所有页面保存到一个新的PDF文件中。

总结

通过结合wxPython和PyMuPDF,我们创建了一个方便实用的工具,可以快速将PNG图像合并为PDF文档。该程序不仅操作简单,还具有预览功能,可以确认要合并的图像顺序。你可以根据自己的需求对代码进行进一步扩展和定制,例如支持其他图像格式、调整图像大小或添加水印等。无论是用于工作还是个人使用,这个小工具都将为你节省宝贵的时间和精力。

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

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

相关文章

基于SpringBoot设计模式之创建型设计模式·生成器模式

文章目录 介绍开始架构图样例一定义生成器定义具体生成器(HTML格式、markdown格式)实体类HTML格式生成器MarkDown格式生成器 测试样例 总结优点缺点 介绍 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。   如…

flowable工作流设置审批人为指定角色+部门的实现方式

一、绘制流程图页面配置 1、指定固定审批角色组织的实现 如上图红框部分,需要修改此处为需求对应。比如此时红框不支持指定某个部门下的指定角色这种组合判断的审批人。则需要修改页面变成选完角色同时也选择上部门统一生成一个group标识。 修改完后,生…

股指期货基差衡量的是什么?

在股指期货市场中,基差、升水和贴水是三个关键的术语,这些基差衡量的是现货市场的价格与期货市场的价格之间的差异。 一、基差:现货与期货的价差 1. 定义:基差是指现货价格与相应期货合约价格之间的差额。计算方式是现货价格减去…

SFTPGO 整合minio AD群组 测试 |sftpgo with minio and ldap group test

SFTP-GO 研究 最近在测试sftpgo,发现中文的资料比较少,在企业中很多存储开始支持S3,比如netapp 于是想尝试把文件服务器换成sftpgoS3的存储,sftp go和AD 群组的搭配测试比较少 自己测试了一把,觉得还是没有server-u的A…

JVS物联网、无忧企业文档、规则引擎5.14功能新增说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了 低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…

函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归(recursive)调用。C和C允许函数的递归调用。例如: int f(int x) { int y,z; zf(y); //在调用函数 f 的过程中&…

云服务器修改端口通常涉及几个步骤

云服务器修改端口通常涉及几个步骤 远程连接并登录到Linux云服务器: 使用SSH工具(如PuTTY、SecureCRT等)远程连接到云服务器。 输入云服务器的IP地址、用户名和密码(或密钥)进行登录。 修改SSH配置文件&#xff1a…

Jmeter使用While控制器

1.前言 对于性能测试场景中,需要用”执行某个事物,直到一个条件停止“的概念时,While控制器控制器无疑是首选,但是在编写脚本时,经常会出现推出循环异常,获取参数异常等问题,下面总结两种常用的…

如何将Excel表格中的图片链接直接显示成图片?

在 Excel 中,你可以通过以下步骤将图片链接转换为直接显示图片: 1. **插入图片链接**:首先,在 Excel 表格中插入图片的链接。你可以在某个单元格中输入图片的链接地址,或者使用 Excel 的“插入图片”功能插入链接。 2.…

从新手到高手,教你如何改造你的广告思维方式!

想要广告震撼人心又让人长时间记住?答案肯定是“创意”二字。广告创意,说白了就是脑洞大开,想法新颖。那些很流行的广告,都是因为背后的想法特别、新颖。做广告啊,就得不停地思考,创新思维是关键。 广告思…

天锐绿盾 | 如何防止电脑内文件遭到泄露?

天锐绿盾是一款专为企业设计的数据防泄漏软件系统,它通过一系列综合性的安全措施来有效防止电脑内文件遭到泄露。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾防止文件泄露的主要功能和方法&a…

【CSP CCF记录】202009-1 称检测点查询

题目 过程 难点&#xff1a;编号和位置的一一对应&#xff0c;不同位置的距离可能相等。 所以使用一个结构体记录不同检测点的编号和到居民地的距离。 sort函数进行排序。Sort函数使用方法 参考&#xff1a;http://t.csdnimg.cn/Y0Hpi 代码 #include <bits/stdc.h>…

人工智能AI聊天chatgpt系统openai对话创作文言一心源码APP小程序功能介绍

你提到的是一个集成了多种智能AI创作能力的系统&#xff0c;它结合了OpenAI的ChatGPT、百度的文言一心&#xff08;ERNIE Bot&#xff09;以及可能的微信WeLM&#xff08;或其他类似接口&#xff09;等。这样的系统确实能够极大地提高创作效率&#xff0c;并且在各种场景下为用…

Rust Web开发框架actix-web入门案例

概述 在看书的时候&#xff0c;用到了actix-web这个框架的案例。 书里面的版本是1.0&#xff0c;但是我看官网最新都4.4了。 为了抹平这种信息差&#xff0c;所以我决定把官方提供的示例代码过一遍。 核心代码 Cargo.toml [package] name "hello" version &q…

随笔:贝特弹琴

半年前&#xff0c;我买了一架朗朗代言的智能电子琴。所谓智能是指&#xff0c;它配套的手机软件知道你在按哪个键&#xff0c;它还能让任意按键发光。用专业术语说&#xff0c;它的键盘具有输入和输出功能&#xff0c;和软件组合起来是一个完整的计算机系统。 随着软件练习曲…

使用Postman来调用Salesforce Bulk API 2.0的方法

简介 Bulk API 2.0 可以支持大量数据增删改查&#xff0c; 用新版的Dataloader也可以进行访问&#xff0c;但Dataloader会把CSV里的数据先转成Bean对象&#xff0c;这样会耗费大量的时间&#xff0c;而且数据量过大会卡死&#xff0c;所以直接上传CSV会节省大量时间和避免卡死风…

关于电源1

电源的定义 广义定义&#xff1a;电源是将其它形式的能转换成电能的装置。 例如&#xff1a;发电机&#xff1a;将热能、水能、风能、核能、光照、震动等转化为电能的装置。 电池&#xff1a;将化学能转换为电能。 狭义定义&#xf…

每天认识新职业——程序员

一、程序员是什么 程序员是从事程序开发、程序维护的基层工作人员。一般将程序员分为程序设计人员和程序编码人员&#xff0c;但两者的界限并不非常清楚。随着互联网的不断普及&#xff0c;网络上把男程序员称作“程序猿"&#xff0c;女程序员称作“程序媛"。或统称…

Java进阶11 IO流、功能流

Java进阶11 IO流-功能流 一、字符缓冲流 字符缓冲流在源代码中内置了字符数组&#xff0c;可以提高读写效率 1、构造方法 方法说明BufferedReader(new FileReader(文件路径))对传入的字符输入流进行包装BufferedWriter(new FileWriter(文件路径))对传入的字符输出流进行包装…