使用Python打造高效的PDF文件管理應(yīng)用
在日常工作和學(xué)習(xí)中,我們經(jīng)常需要處理大量PDF文件。手動合并、分割PDF不僅耗時,還容易出錯。今天,我們將使用Python的wxPython和PyMuPDF庫,開發(fā)一個強大且易用的PDF文件管理工具。
C:\pythoncode\new\mergeAndsplitPdf.py
所有代碼
import os import wx import fitz # PyMuPDF class PDFManagerApp(wx.Frame): def __init__(self): super().__init__(parent=None, title='PDF文件管理器') # 主面板 panel = wx.Panel(self) # 垂直布局 main_sizer = wx.BoxSizer(wx.VERTICAL) # 文件夾選擇行 folder_sizer = wx.BoxSizer(wx.HORIZONTAL) self.folder_path = wx.TextCtrl(panel, style=wx.TE_READONLY) select_folder_btn = wx.Button(panel, label='選擇文件夾') select_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_folder) folder_sizer.Add(self.folder_path, proportion=1, flag=wx.EXPAND|wx.ALL, border=5) folder_sizer.Add(select_folder_btn, flag=wx.ALL, border=5) # PDF文件列表 self.pdf_list = wx.ListBox(panel, style=wx.LB_MULTIPLE) # 操作按鈕行 btn_sizer = wx.BoxSizer(wx.HORIZONTAL) merge_btn = wx.Button(panel, label='合并PDF') split_btn = wx.Button(panel, label='分割PDF') merge_btn.Bind(wx.EVT_BUTTON, self.merge_pdfs) split_btn.Bind(wx.EVT_BUTTON, self.split_pdfs) btn_sizer.Add(merge_btn, flag=wx.ALL, border=5) btn_sizer.Add(split_btn, flag=wx.ALL, border=5) # 將所有部件添加到主布局 main_sizer.Add(folder_sizer, flag=wx.EXPAND) main_sizer.Add(self.pdf_list, proportion=1, flag=wx.EXPAND|wx.ALL, border=5) main_sizer.Add(btn_sizer, flag=wx.CENTER) panel.SetSizer(main_sizer) # 設(shè)置窗口大小和居中 self.SetSize((500, 600)) self.Centre() def on_select_folder(self, event): """選擇文件夾并列出PDF文件""" with wx.DirDialog(self, "選擇包含PDF文件的文件夾") as dlg: if dlg.ShowModal() == wx.ID_OK: folder_path = dlg.GetPath() self.folder_path.SetValue(folder_path) # 清空并重新加載PDF文件列表 self.pdf_list.Clear() # 獲取文件夾中的所有PDF文件 pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf')] pdf_files.sort() # 按文件名排序 # 添加到列表框 for pdf in pdf_files: self.pdf_list.Append(pdf) def merge_pdfs(self, event): """合并選中的PDF文件""" # 獲取選中的文件索引 selections = self.pdf_list.GetSelections() if not selections: wx.MessageBox('請先選擇要合并的PDF文件', '提示', wx.OK | wx.ICON_INFORMATION) return # 準備保存文件對話框 with wx.FileDialog(self, "保存合并后的PDF", wildcard="PDF files (*.pdf)|*.pdf", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as saveDialog: if saveDialog.ShowModal() == wx.ID_OK: output_path = saveDialog.GetPath() # 獲取文件夾路徑和選中的文件名 folder_path = self.folder_path.GetValue() selected_files = [self.pdf_list.GetString(idx) for idx in selections] try: # 打開所有PDF pdf_docs = [fitz.open(os.path.join(folder_path, f)) for f in selected_files] # 創(chuàng)建一個新的PDF文檔 merged_pdf = fitz.open() # 逐個合并文檔 for doc in pdf_docs: merged_pdf.insert_pdf(doc) # 保存合并后的PDF merged_pdf.save(output_path) merged_pdf.close() # 關(guān)閉所有打開的文檔 for doc in pdf_docs: doc.close() wx.MessageBox('PDF文件合并成功!', '成功', wx.OK | wx.ICON_INFORMATION) except Exception as e: wx.MessageBox(f'合并PDF時發(fā)生錯誤:{str(e)}', '錯誤', wx.OK | wx.ICON_ERROR) def split_pdfs(self, event): """將選中的PDF文件按頁分割""" # 獲取選中的文件索引 selections = self.pdf_list.GetSelections() if not selections: wx.MessageBox('請先選擇要分割的PDF文件', '提示', wx.OK | wx.ICON_INFORMATION) return # 選擇輸出文件夾 with wx.DirDialog(self, "選擇PDF頁面輸出文件夾") as dlg: if dlg.ShowModal() == wx.ID_OK: output_folder = dlg.GetPath() # 獲取文件夾路徑和選中的文件名 folder_path = self.folder_path.GetValue() selected_files = [self.pdf_list.GetString(idx) for idx in selections] try: # 處理每個選中的PDF文件 for filename in selected_files: input_path = os.path.join(folder_path, filename) pdf_doc = fitz.open(input_path) # 為每一頁創(chuàng)建單獨的PDF for page_num in range(len(pdf_doc)): # 創(chuàng)建只包含當前頁的新PDF single_page_pdf = fitz.open() single_page_pdf.insert_pdf(pdf_doc, from_page=page_num, to_page=page_num) # 生成輸出文件名 base_name = os.path.splitext(filename)[0] output_filename = f"{base_name}_page_{page_num+1}.pdf" output_path = os.path.join(output_folder, output_filename) # 保存單頁PDF single_page_pdf.save(output_path) single_page_pdf.close() pdf_doc.close() wx.MessageBox('PDF文件已成功分割!', '成功', wx.OK | wx.ICON_INFORMATION) except Exception as e: wx.MessageBox(f'分割PDF時發(fā)生錯誤:{str(e)}', '錯誤', wx.OK | wx.ICON_ERROR) def main(): app = wx.App() frame = PDFManagerApp() frame.Show() app.MainLoop() if __name__ == '__main__': main()
項目背景
隨著數(shù)字文檔的普及,PDF已成為最常用的文檔格式之一。然而,對PDF文件的管理和處理往往讓人感到繁瑣。市面上的PDF工具要么功能單一,要么操作復(fù)雜,價格高昂。
技術(shù)選型
我們選擇了以下技術(shù)棧:
wxPython:跨平臺的GUI框架,提供原生的用戶界面體驗
PyMuPDF:高性能的PDF處理庫,支持文檔合并、分割等操作
Python:簡潔且強大的編程語言
核心功能
1. 文件夾選擇與PDF列表
應(yīng)用程序提供了直觀的文件夾選擇功能。用戶只需點擊"選擇文件夾"按鈕,即可瀏覽并選擇包含PDF文件的目錄。所有PDF文件將按文件名自動排序顯示在列表中。
def on_select_folder(self, event): with wx.DirDialog(self, "選擇包含PDF文件的文件夾") as dlg: if dlg.ShowModal() == wx.ID_OK: folder_path = dlg.GetPath() # 獲取并排序PDF文件列表 pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf')] pdf_files.sort()
2. PDF文件合并
再也不用擔心手動合并多個PDF文件了!我們的應(yīng)用支持多文件選擇和快速合并。用戶可以:
選擇多個PDF文件
點擊"合并PDF"按鈕
選擇合并后文件的保存位置
核心合并邏輯如下:
def merge_pdfs(self, event): # 獲取選中的文件 selected_files = [self.pdf_list.GetString(idx) for idx in selections] # 使用PyMuPDF合并PDF pdf_docs = [fitz.open(os.path.join(folder_path, f)) for f in selected_files] merged_pdf = fitz.open() for doc in pdf_docs: merged_pdf.insert_pdf(doc) merged_pdf.save(output_path)
3. PDF文件分割
需要將一個PDF文件按頁拆分?輕松搞定!
選擇要分割的PDF文件
點擊"分割PDF"按鈕
選擇輸出文件夾
應(yīng)用程序?qū)⒆詣訛槊恳豁撋瑟毩⒌腜DF文件
分割實現(xiàn)代碼:
def split_pdfs(self, event): for filename in selected_files: pdf_doc = fitz.open(input_path) for page_num in range(len(pdf_doc)): # 創(chuàng)建單頁PDF single_page_pdf = fitz.open() single_page_pdf.insert_pdf(pdf_doc, from_page=page_num, to_page=page_num) # 保存單頁PDF output_filename = f"{base_name}_page_{page_num+1}.pdf" single_page_pdf.save(output_path)
使用指南
環(huán)境準備
安裝必要的依賴:
pip install wxPython pymupdf
運行應(yīng)用
- 克隆項目代碼
- 執(zhí)行 python mergeAndsplitPdf.py
- 選擇文件夾,開始管理您的PDF文件!
運行結(jié)果
以上就是使用Python打造高效的PDF文件管理應(yīng)用的詳細內(nèi)容,更多關(guān)于Python PDF文件管理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python根據(jù)給定模型進行特征權(quán)值計算
在機器學(xué)習(xí)中,特征權(quán)重的計算是理解模型如何做出預(yù)測的重要步驟,本文將詳細介紹如何使用Python根據(jù)給定模型計算特征權(quán)重,希望對大家有一定的幫助2024-11-11Python實現(xiàn)PDF文字識別提取并寫入CSV文件
這篇文章主要是和大家分享一個Python實現(xiàn)PDF文字識別與提取并寫入?CSV文件的腳本。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-03-03Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境
這篇文章主要介紹了Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境的教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04django中F表達式和Q函數(shù)應(yīng)用與原理詳解
F對象查詢與Q對象查詢,剛看到大家一定會感到很陌生,其實它們也是 Django 提供的查詢方法,而且非常的簡單的高效,下面這篇文章主要給大家介紹了關(guān)于django中F表達式和Q函數(shù)應(yīng)用與原理的相關(guān)資料,需要的朋友可以參考下2023-05-05Tensorflow中的placeholder和feed_dict的使用
這篇文章主要介紹了Tensorflow中的placeholder和feed_dict的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07