在日常工作中,我們經常需要將多個圖像文件合并到一個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文檔。該程序不僅操作簡單,還具有預覽功能,可以確認要合并的圖像順序。你可以根據自己的需求對代碼進行進一步擴展和定制,例如支持其他圖像格式、調整圖像大小或添加水印等。無論是用于工作還是個人使用,這個小工具都將為你節省寶貴的時間和精力。