使用Python打造高效的PDF文件管理應用
在日常工作和學習中,我們經(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)
# 設置窗口大小和居中
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()
# 關閉所有打開的文檔
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工具要么功能單一,要么操作復雜,價格高昂。
技術選型
我們選擇了以下技術棧:
wxPython:跨平臺的GUI框架,提供原生的用戶界面體驗
PyMuPDF:高性能的PDF處理庫,支持文檔合并、分割等操作
Python:簡潔且強大的編程語言
核心功能
1. 文件夾選擇與PDF列表
應用程序提供了直觀的文件夾選擇功能。用戶只需點擊"選擇文件夾"按鈕,即可瀏覽并選擇包含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文件了!我們的應用支持多文件選擇和快速合并。用戶可以:
選擇多個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"按鈕
選擇輸出文件夾
應用程序將自動為每一頁生成獨立的PDF文件
分割實現(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
運行應用
- 克隆項目代碼
- 執(zhí)行 python mergeAndsplitPdf.py
- 選擇文件夾,開始管理您的PDF文件!
運行結果

以上就是使用Python打造高效的PDF文件管理應用的詳細內容,更多關于Python PDF文件管理的資料請關注腳本之家其它相關文章!
相關文章
基于Tensorflow批量數(shù)據(jù)的輸入實現(xiàn)方式
今天小編就為大家分享一篇基于Tensorflow批量數(shù)據(jù)的輸入實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
libreoffice python 操作word及excel文檔的方法
這篇文章主要介紹了libreoffice python 操作word及excel文檔的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
在PyCharm中使用Git和Gitee進行版本控制的操作流程
該文章詳細介紹了在PyCharm中使用Git與Gitee進行版本控制的全過程,包括環(huán)境準備、基本操作、分支管理、拉取與克隆、以及避免沖突的IDE操作等步驟,設置Git路徑和Gitee插件是基礎,之后可以進行項目初始化、添加、推送等,需要的朋友可以參考下2026-05-05
關于pygame自定義窗口創(chuàng)建及相關操作指南
對于開發(fā)一個游戲來說,窗口的顯示肯定是前提中的前提,對于pygame來說,只需要一小段代碼就可以初始化窗口,下面這篇文章主要給大家介紹了關于pygame自定義窗口創(chuàng)建及相關操作的相關資料,需要的朋友可以參考下2022-07-07
Python對集合使用sort()排序報錯AttributeError的解決方法
這篇文章主要為大家詳細介紹了 Python對集合使用sort()排序報錯AttributeError的解決方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2025-11-11

