最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python打造高效的PDF文件管理應(yīng)用

 更新時(shí)間:2024年12月19日 09:00:00   作者:winfredzhang  
在日常工作和學(xué)習(xí)中,我們經(jīng)常需要處理大量PDF文件,本文將使用Python的wxPython和PyMuPDF庫(kù),開(kāi)發(fā)一個(gè)強(qiáng)大且易用的PDF文件管理工具,需要的可以參考下

在日常工作和學(xué)習(xí)中,我們經(jīng)常需要處理大量PDF文件。手動(dòng)合并、分割PDF不僅耗時(shí),還容易出錯(cuò)。今天,我們將使用Python的wxPython和PyMuPDF庫(kù),開(kāi)發(fā)一個(gè)強(qiáng)大且易用的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('請(qǐng)先選擇要合并的PDF文件', '提示', wx.OK | wx.ICON_INFORMATION)
            return
        
        # 準(zhǔn)備保存文件對(duì)話框
        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:
                    # 打開(kāi)所有PDF
                    pdf_docs = [fitz.open(os.path.join(folder_path, f)) for f in selected_files]
                    
                    # 創(chuàng)建一個(gè)新的PDF文檔
                    merged_pdf = fitz.open()
                    
                    # 逐個(gè)合并文檔
                    for doc in pdf_docs:
                        merged_pdf.insert_pdf(doc)
                    
                    # 保存合并后的PDF
                    merged_pdf.save(output_path)
                    merged_pdf.close()
                    
                    # 關(guān)閉所有打開(kāi)的文檔
                    for doc in pdf_docs:
                        doc.close()
                    
                    wx.MessageBox('PDF文件合并成功!', '成功', wx.OK | wx.ICON_INFORMATION)
                
                except Exception as e:
                    wx.MessageBox(f'合并PDF時(shí)發(fā)生錯(cuò)誤:{str(e)}', '錯(cuò)誤', wx.OK | wx.ICON_ERROR)

    def split_pdfs(self, event):
        """將選中的PDF文件按頁(yè)分割"""
        # 獲取選中的文件索引
        selections = self.pdf_list.GetSelections()
        
        if not selections:
            wx.MessageBox('請(qǐng)先選擇要分割的PDF文件', '提示', wx.OK | wx.ICON_INFORMATION)
            return
        
        # 選擇輸出文件夾
        with wx.DirDialog(self, "選擇PDF頁(yè)面輸出文件夾") 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:
                    # 處理每個(gè)選中的PDF文件
                    for filename in selected_files:
                        input_path = os.path.join(folder_path, filename)
                        pdf_doc = fitz.open(input_path)
                        
                        # 為每一頁(yè)創(chuàng)建單獨(dú)的PDF
                        for page_num in range(len(pdf_doc)):
                            # 創(chuàng)建只包含當(dāng)前頁(yè)的新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)
                            
                            # 保存單頁(yè)P(yáng)DF
                            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時(shí)發(fā)生錯(cuò)誤:{str(e)}', '錯(cuò)誤', wx.OK | wx.ICON_ERROR)

def main():
    app = wx.App()
    frame = PDFManagerApp()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

項(xiàng)目背景

隨著數(shù)字文檔的普及,PDF已成為最常用的文檔格式之一。然而,對(duì)PDF文件的管理和處理往往讓人感到繁瑣。市面上的PDF工具要么功能單一,要么操作復(fù)雜,價(jià)格高昂。

技術(shù)選型

我們選擇了以下技術(shù)棧:

wxPython:跨平臺(tái)的GUI框架,提供原生的用戶界面體驗(yàn)

PyMuPDF:高性能的PDF處理庫(kù),支持文檔合并、分割等操作

Python:簡(jiǎn)潔且強(qiáng)大的編程語(yǔ)言

核心功能

1. 文件夾選擇與PDF列表

應(yīng)用程序提供了直觀的文件夾選擇功能。用戶只需點(diǎn)擊"選擇文件夾"按鈕,即可瀏覽并選擇包含PDF文件的目錄。所有PDF文件將按文件名自動(dòng)排序顯示在列表中。

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文件合并

再也不用擔(dān)心手動(dòng)合并多個(gè)PDF文件了!我們的應(yīng)用支持多文件選擇和快速合并。用戶可以:

選擇多個(gè)PDF文件

點(diǎn)擊"合并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文件分割

需要將一個(gè)PDF文件按頁(yè)拆分?輕松搞定!

選擇要分割的PDF文件

點(diǎn)擊"分割PDF"按鈕

選擇輸出文件夾

應(yīng)用程序?qū)⒆詣?dòng)為每一頁(yè)生成獨(dú)立的PDF文件

分割實(shí)現(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)建單頁(yè)P(yáng)DF
            single_page_pdf = fitz.open()
            single_page_pdf.insert_pdf(pdf_doc, from_page=page_num, to_page=page_num)
            
            # 保存單頁(yè)P(yáng)DF
            output_filename = f"{base_name}_page_{page_num+1}.pdf"
            single_page_pdf.save(output_path)

使用指南

環(huán)境準(zhǔn)備

安裝必要的依賴:

pip install wxPython pymupdf

運(yùn)行應(yīng)用

  • 克隆項(xiàng)目代碼
  • 執(zhí)行 python mergeAndsplitPdf.py
  • 選擇文件夾,開(kāi)始管理您的PDF文件!

運(yùn)行結(jié)果

以上就是使用Python打造高效的PDF文件管理應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于Python PDF文件管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Tensorflow批量數(shù)據(jù)的輸入實(shí)現(xiàn)方式

    基于Tensorflow批量數(shù)據(jù)的輸入實(shí)現(xiàn)方式

    今天小編就為大家分享一篇基于Tensorflow批量數(shù)據(jù)的輸入實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python入門(mén)教程(二十一)Python的數(shù)組

    Python入門(mén)教程(二十一)Python的數(shù)組

    這篇文章主要介紹了Python入門(mén)教程(二十一)Python的數(shù)組,數(shù)組是一種特殊變量,數(shù)組可以在單個(gè)名稱(chēng)下保存多個(gè)值,我們可以通過(guò)引用索引號(hào)來(lái)訪問(wèn)這些值,需要的朋友可以參考下
    2023-04-04
  • 使用Python實(shí)現(xiàn)可恢復(fù)式多線程下載器

    使用Python實(shí)現(xiàn)可恢復(fù)式多線程下載器

    在數(shù)字時(shí)代,大文件下載已成為日常操作,本文將手把手教你用Python打造專(zhuān)業(yè)級(jí)下載器,實(shí)現(xiàn)斷點(diǎn)續(xù)傳,多線程加速,速度限制等功能,感興趣的小伙伴可以了解下
    2025-06-06
  • libreoffice python 操作word及excel文檔的方法

    libreoffice python 操作word及excel文檔的方法

    這篇文章主要介紹了libreoffice python 操作word及excel文檔的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 在PyCharm中使用Git和Gitee進(jìn)行版本控制的操作流程

    在PyCharm中使用Git和Gitee進(jìn)行版本控制的操作流程

    該文章詳細(xì)介紹了在PyCharm中使用Git與Gitee進(jìn)行版本控制的全過(guò)程,包括環(huán)境準(zhǔn)備、基本操作、分支管理、拉取與克隆、以及避免沖突的IDE操作等步驟,設(shè)置Git路徑和Gitee插件是基礎(chǔ),之后可以進(jìn)行項(xiàng)目初始化、添加、推送等,需要的朋友可以參考下
    2026-05-05
  • 在FastAPI中改變響應(yīng)狀態(tài)碼的兩種方法

    在FastAPI中改變響應(yīng)狀態(tài)碼的兩種方法

    FastAPI,顧名思義,是一個(gè)快速、現(xiàn)代、高性能的web框架,用于用Python構(gòu)建后端api,響應(yīng)狀態(tài)碼是一個(gè)三位數(shù),表示請(qǐng)求的結(jié)果,在這篇簡(jiǎn)明的基于示例的博文中,我將向你展示在FastAPI中更改響應(yīng)狀態(tài)代碼的兩種不同方法,需要的朋友可以參考下
    2025-02-02
  • 關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作指南

    關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作指南

    對(duì)于開(kāi)發(fā)一個(gè)游戲來(lái)說(shuō),窗口的顯示肯定是前提中的前提,對(duì)于pygame來(lái)說(shuō),只需要一小段代碼就可以初始化窗口,下面這篇文章主要給大家介紹了關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Python對(duì)集合使用sort()排序報(bào)錯(cuò)AttributeError的解決方法

    Python對(duì)集合使用sort()排序報(bào)錯(cuò)AttributeError的解決方法

    這篇文章主要為大家詳細(xì)介紹了 Python對(duì)集合使用sort()排序報(bào)錯(cuò)AttributeError的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-11-11
  • python 讀取.nii格式圖像實(shí)例

    python 讀取.nii格式圖像實(shí)例

    這篇文章主要介紹了python 讀取.nii格式圖像實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 一文教你PyCharm如何有效地添加源與庫(kù)

    一文教你PyCharm如何有效地添加源與庫(kù)

    在使用PyCharm進(jìn)行Python開(kāi)發(fā)的時(shí)候,很多時(shí)候我們需要添加庫(kù)或者設(shè)置源,下面我們就來(lái)和大家詳細(xì)介紹一下如何在PyCharm中添加源和庫(kù)吧
    2025-03-03

最新評(píng)論

曲靖市| 汶上县| 长汀县| 来凤县| 望江县| 宝丰县| 磐石市| 永平县| 临猗县| 屏南县| 泾川县| 金阳县| 精河县| 林口县| 东乡县| 舞阳县| 大英县| 旬邑县| 辛集市| 双辽市| 沙雅县| 岳阳县| 乌拉特后旗| 遂昌县| 西峡县| 辛集市| 寿光市| 阿尔山市| 哈尔滨市| 阿克苏市| 屏东市| 刚察县| 临清市| 老河口市| 潍坊市| 宜川县| 乌拉特后旗| 海丰县| 北流市| 金平| 鲁山县|