PyMuPDF ライブラリを使用した PDF の結合および分割プログラム

PDF Tools アプリケーションは、PDF ファイルを結合および分割するために、wxPython と PyMuPDF ライブラリを使用して作成されたシンプルなツールです。ユーザーフレンドリーなグラフィカルインターフェイスを提供し、ユーザーはソースフォルダーと宛先フォルダーを選択し、PDF ファイルに対して操作を実行できます。
C:\pythoncode\blog\pdfmergandsplit.py
ここに画像の説明を挿入

特徴

  • フォルダーの選択: ユーザーは、アプリケーション インターフェイスを通じてソース フォルダーと宛先フォルダーを簡単に選択できます。
  • PDF ファイルの結合: このアプリケーションでは、ユーザーが PDF ファイルを選択して結合し、単一の PDF ファイルに結合することができます。
  • PDF ファイルの分割: ユーザーは PDF ファイルを選択して、それぞれ 1 ページを含む複数の個別の PDF ファイルに分割できます。

プログラムの実装

アプリケーションは次のライブラリとモジュールを使用します。

  • wxPython : アプリケーションを作成するためのグラフィカル ユーザー インターフェイス。
  • PyMuPDF : PDF ファイルを操作するためのライブラリ。

アプリケーションの主要部分はwx.Frameメイン ウィンドウであり、wxPython から継承されたクラスです。ウィンドウには次のコンポーネントが含まれています。

  • ソースフォルダーと宛先フォルダーのボタンを選択します。
  • PDF ファイル リスト ボックス。ソース フォルダー内の PDF ファイルが表示されます。
  • 対応するアクションを実行するための結合ボタンと分割ボタン。

ユーザーが「ソース フォルダーの選択」ボタンをタップすると、アプリケーションはユーザーがソース フォルダーを選択できるフォルダー選択ダイアログを表示します。選択後、アプリケーションはフォルダー パスを取得し、フォルダー内の PDF ファイルを一覧表示します。[結合] ボタンと [分割] ボタンが使用可能になり、ユーザーは適切なアクションを実行できるようになります。

マージ ボタンのクリック イベントにより、テキスト入力ダイアログ ボックスがポップアップ表示され、ユーザーはマージされたファイルの名前を入力する必要があります。ユーザー入力後、アプリケーションは PyMuPDF ライブラリを呼び出して選択された PDF ファイルを結合し、結合された PDF ファイルをターゲット フォルダーに保存します。

分割ボタンのクリック イベントは、選択した PDF ファイルを反復処理し、PyMuPDF ライブラリを使用して各ページを個別の PDF ファイルとして保存します。

コード例

アプリケーションのコードサンプルは次のとおりです。

import os
import wx
import fitz

class PDFToolApp(wx.Frame):
    def __init__(self, parent, title):
        super(PDFToolApp, self).__init__(parent, title=title, size=(400, 400))

        self.panel = wx.Panel(self)
        self.source_folder_btn = wx.Button(self.panel, -1, "选择源文件夹")
        self.target_folder_btn = wx.Button(self.panel, -1, "选择目标文件夹")
        self.pdf_list = wx.CheckListBox(self.panel, -1, choices=[], style=wx.LB_MULTIPLE)
        self.merge_btn = wx.Button(self.panel, -1, "合并")
        self.split_btn = wx.Button(self.panel, -1, "分拆")
        self.merge_btn.Disable()
        self.split_btn.Disable()

        self.source_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_source_folder)
        self.target_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_target_folder)
        self.merge_btn.Bind(wx.EVT_BUTTON, self.on_merge)
        self.split_btn.Bind(wx.EVT_BUTTON, self.on_split)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.source_folder_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        sizer.Add(self.target_folder_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        sizer.Add(self.pdf_list, 1, wx.EXPAND | wx.ALL, 10)
        sizer.Add(self.merge_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        sizer.Add(self.split_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        self.panel.SetSizer(sizer)

        self.Show()

    def on_select_source_folder(self, event):
        dlg = wx.DirDialog(self, "选择源文件夹", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            source_folder_path = dlg.GetPath()
            self.pdf_list.Set(self.get_pdf_files(source_folder_path))
            self.merge_btn.Enable()
            self.split_btn.Enable()
        dlg.Destroy()

    def on_select_target_folder(self, event):
        dlg = wx.DirDialog(self, "选择目标文件夹", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            self.target_folder_path = dlg.GetPath()
        dlg.Destroy()

    def on_merge(self, event):
        selected_items = self.pdf_list.GetCheckedItems()
        if len(selected_items) > 0:
            dlg = wx.TextEntryDialog(self, "请输入合并后的文件名(不带扩展名):", "合并文件")
            if dlg.ShowModal() == wx.ID_OK:
                output_filename = dlg.GetValue()
                output_filepath = os.path.join(self.target_folder_path, output_filename + ".pdf")
                self.merge_pdfs(selected_items, output_filepath)
                wx.MessageBox("PDF文件合并完成!", "完成", wx.OK | wx.ICON_INFORMATION)
            dlg.Destroy()

    def on_split(self, event):
        selected_items = self.pdf_list.GetCheckedItems()
        if len(selected_items) > 0:
            for index in selected_items:
                pdf_filename = self.pdf_list.GetString(index)
                pdf_filepath = os.path.join(self.target_folder_path, pdf_filename)
                self.split_pdf(pdf_filename, pdf_filepath)
            wx.MessageBox("PDF文件分拆完成!", "完成", wx.OK | wx.ICON_INFORMATION)

    def merge_pdfs(self, selected_items, output_filepath):
        pdf_merger = fitz.open()

        for index in selected_items:
            pdf_filename = self.pdf_list.GetString(index)
            pdf_filepath = os.path.join(self.target_folder_path, pdf_filename)
            pdf = fitz.open(pdf_filepath)
            pdf_merger.insert_pdf(pdf)

        pdf_merger.save(output_filepath)
        pdf_merger.close()

    def split_pdf(self, pdf_filename, pdf_filepath):
        pdf = fitz.open(pdf_filepath)
        num_pages = pdf.page_count

        for i in range(num_pages):
            output_filename = f"{
      
      pdf_filename[:-4]}_{
      
      i+1}.pdf"
            output_filepath = os.path.join(self.target_folder_path, os.path.basename(output_filename) )
            print("output_filename:"+output_filename)
            page = pdf[i]
            new_pdf = fitz.open()
            new_pdf.insert_pdf(pdf, from_page=i, to_page=i)
            new_pdf.save(output_filepath)
            print("self.target_folder_path:"+self.target_folder_path)
            print("output_filepath:"+output_filepath)
            new_pdf.close()

        pdf.close()

    def get_pdf_files(self, folder_path):
        pdf_files = []
        for filename in os.listdir(folder_path):
            if filename.endswith(".pdf"):
                pdf_files.append(folder_path+'/'+filename)
        return pdf_files

if __name__ == "__main__":
    app = wx.App()
    PDFToolApp(None, "PDF工具")
    app.MainLoop()

要約する

PDF Tools アプリケーションは、wxPython と PyMuPDF ライブラリを使用して作成された、PDF ファイルの結合と分割を行うためのシンプルなユーティリティです。直感的なグラフィカル インターフェイスを備えており、ユーザーは簡単にフォルダーを選択して操作を実行できます。大量の PDF ファイルを扱う場合でも、単純な分割操作を行う場合でも、このアプリケーションはユーザーのニーズを満たすことができます。

おすすめ

転載: blog.csdn.net/winniezhang/article/details/132333475