用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.pswp.cn/web/12577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12577.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于SpringBoot設計模式之創建型設計模式·生成器模式

文章目錄 介紹開始架構圖樣例一定義生成器定義具體生成器(HTML格式、markdown格式)實體類HTML格式生成器MarkDown格式生成器 測試樣例 總結優點缺點 介紹 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 ??如…

flowable工作流設置審批人為指定角色+部門的實現方式

一、繪制流程圖頁面配置 1、指定固定審批角色組織的實現 如上圖紅框部分,需要修改此處為需求對應。比如此時紅框不支持指定某個部門下的指定角色這種組合判斷的審批人。則需要修改頁面變成選完角色同時也選擇上部門統一生成一個group標識。 修改完后,生…

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

在股指期貨市場中,基差、升水和貼水是三個關鍵的術語,這些基差衡量的是現貨市場的價格與期貨市場的價格之間的差異。 一、基差:現貨與期貨的價差 1. 定義:基差是指現貨價格與相應期貨合約價格之間的差額。計算方式是現貨價格減去…

深入了解MongoDB:利用$type操作符輕松操控數據類型

MongoDB的$type操作符用于檢索具有特定數據類型的字段。以下是有關$type操作符的詳細解釋、命令、示例、應用場景、注意事項和總結: $type操作符用于查詢具有特定數據類型的字段。它接受一個整數參數,該參數對應于MongoDB中的數據類型編號。可以使用$ty…

第4章 Redis,一站式高性能存儲方案【仿牛客網社區論壇項目】

第4章 Redis,一站式高性能存儲方案【仿牛客網社區論壇項目】 前言推薦項目總結第4章 Redis,一站式高性能存儲方案1. Redis入門2. Spring整合Redis3.點贊4.我收到的贊5.關注、取消關注6.關注列表、粉絲列表7.優化登錄模塊 最后 前言 2023-4-30 20:42:51 …

hadoop 安裝步驟

hadoop 是一個免費開源軟件, 可以安裝在window上,但是有些麻煩。 也可以安裝 在linux 上 hadoop 下載地址 :https://hadoop.apache.org/releases.html 安裝前的準備工作: 1.安裝jdk Apache Hadoop 與最新版本的JDK不兼容。建議下載Java SE D…

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…

ubuntu在當前路徑下打開Terminal

在 Ubuntu 20.04 中,nautilus-open-terminal 已經被 nautilus-extension-gnome-terminal 替代了。你可以嘗試安裝這個新的包。以下是在終端中執行的命令: sudo apt-get update sudo apt-get install nautilus-extension-gnome-terminal安裝完成后&#…

Java面向對象——抽象類

abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那么該方法就是抽象方法;如果修飾類,那么該類就是抽象類。 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要聲明為抽象類。 抽象類,不能…

函數的遞歸調用

在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸(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…

qt 麒麟系統 connot find /usr/local/lib

目錄 解決方法: 后來又報錯: cannot find -lopencv_world3.4.6 connot find /usr/local/lib 解決方法: LIBS -L/usr/local/lib -lopencv_world3.4.6QMAKE_LFLAGS -Wl,-rpath,/usr/local/lib 后來又報錯: cannot find -lopencv…

【CSP CCF記錄】202009-1 稱檢測點查詢

題目 過程 難點&#xff1a;編號和位置的一一對應&#xff0c;不同位置的距離可能相等。 所以使用一個結構體記錄不同檢測點的編號和到居民地的距離。 sort函數進行排序。Sort函數使用方法 參考&#xff1a;http://t.csdnimg.cn/Y0Hpi 代碼 #include <bits/stdc.h>…

Vue3.0-Ref

一、值類型與引用類型 1.1 定義和說明 在JavaScript中&#xff0c;數據類型可以分為兩類&#xff1a;值類型&#xff08;或基本數據類型&#xff09;和引用類型。 值類型&#xff08;基本數據類型&#xff09;&#xff1a; undefined null boolean number string symbo…