【python012】Python根據頁碼處理PDF檔案的內容

kngines發表於2024-06-25

在日常工作和學習中,需要從PDF檔案中提取特定頁面的內容,以便進行知識、材料壓縮等。
2.歡迎點贊、關注、批評、指正,互三走起來,小手動起來!
3.歡迎點贊、關注、批評、指正,互三走起來,小手動起來!

目錄
  • 1.環境準備
  • 2.Python參考程式碼
  • 3.參考文章

1.環境準備

  • pymupdf: 是wxWidgetsPython語言下的封裝,處理PDF檔案的庫,提供了讀取、提取和建立PDF檔案的功能;wxWidgets是一個跨平臺的GUI應用程式設計介面,使用C++編寫。
  • wxPython: 基於wxWidgetsPython包,用於建立跨平臺的圖形使用者介面(GUI)應用程式。
  • fitz: fitz庫是一個基於Python開發的PDF處理庫,它是PyMuPDF的前身。fitz提供了一系列的API和功能,可以用於讀取、編輯和生成PDF檔案。此外,它還可以處理其他型別的影像,如TIFF和JPEG,提供影像處理功能,如旋轉、裁剪、縮放、調整亮度、對比度和色彩平衡等。
    • 在Python中,fitz庫可以用於多種任務,如開啟PDF檔案、遍歷頁面、新增註釋、提取文字、旋轉頁面等。此外,它還可以用於在PDF頁面上新增高亮註釋、提取影像等操作。
    pip install PIL
    pip install fitz
    pip install pymupdf
    pip install wxpython
    
    # pip install 庫包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
    # pip install wxpython -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com       
    

2.Python參考程式碼

  • 建立1個簡單的GUI應用程式,它將允許使用者選擇要開啟的PDF檔案,並輸入開始頁碼和結束頁碼。然後,點選"Extract"按鈕將提取指定範圍內的頁面並將其儲存為新的PDF檔案

    import fitz
    import wx
    
    class PDFExtractor(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"PDF Extractor", pos=wx.DefaultPosition,
                              size=wx.Size(500, 254), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL,
                              name=u"PDF Extractor")
    
            self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
            self.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
            self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION))
    
            bSizer2 = wx.BoxSizer(wx.VERTICAL)
    
            self.m_filePicker2 = wx.FilePickerCtrl(self, wx.ID_ANY, wx.EmptyString, u"Select a file", u"*.*",
                                                   wx.DefaultPosition, wx.DefaultSize, wx.FLP_DEFAULT_STYLE)
            self.m_filePicker2.SetFont(wx.Font(9, 74, 90, 92, False, "微軟雅黑"))
            self.m_filePicker2.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT))
            self.m_filePicker2.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT))
    
            bSizer2.Add(self.m_filePicker2, 0, wx.ALL | wx.EXPAND, 5)
    
            self.m_staticText5 = wx.StaticText(self, wx.ID_ANY, u"Start Page:", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_staticText5.Wrap(-1)
            self.m_staticText5.SetFont(wx.Font(9, 74, 90, 92, True, "微軟雅黑"))
            self.m_staticText5.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT))
    
            bSizer2.Add(self.m_staticText5, 0, wx.ALL, 5)
    
            self.m_textCtrl1 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
            bSizer2.Add(self.m_textCtrl1, 0, wx.EXPAND, 5)
    
            self.m_staticText6 = wx.StaticText(self, wx.ID_ANY, u"End Page:", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_staticText6.Wrap(-1)
            self.m_staticText6.SetFont(wx.Font(9, 74, 90, 92, True, "微軟雅黑"))
            self.m_staticText6.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT))
    
            bSizer2.Add(self.m_staticText6, 0, wx.ALL, 5)
    
            self.m_textCtrl2 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
            bSizer2.Add(self.m_textCtrl2, 0, wx.EXPAND, 5)
    
            self.m_button18 = wx.Button(self, wx.ID_ANY, u"Extract", wx.DefaultPosition, wx.DefaultSize, wx.NO_BORDER)
            self.m_button18.SetFont(wx.Font(12, 74, 90, 92, False, "微軟雅黑"))
            self.m_button18.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT))
            self.m_button18.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNHIGHLIGHT))
    
    
            self.m_button18.Bind(wx.EVT_BUTTON, self.extract_pages)
    
            bSizer2.Add(self.m_button18, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.SHAPED, 5)
    
            self.SetSizer(bSizer2)
            self.Layout()
            self.Centre(wx.BOTH)
        def __del__(self):
            pass
    
        def extract_pages(self, event):
            file_path = self.m_filePicker2.GetPath()
            start_page = int(self.m_textCtrl1.GetValue())
            end_page = int(self.m_textCtrl2.GetValue())
    
            doc = fitz.open(file_path)
            output_doc = fitz.open()
    
            for page_num in range(start_page - 1, end_page):
                output_doc.insert_pdf(doc, from_page=page_num, to_page=page_num)
    
            output_path = file_path.replace(".pdf", "_extracted.pdf")
            output_doc.save(output_path)
            output_doc.close()
            doc.close()
    
            wx.MessageBox("Extraction complete!", "Success", wx.OK | wx.ICON_INFORMATION)
    
    
    # app = wx.App()
    # PDFExtractor(None, title="PDF Extractor")
    # app.MainLoop()
    
    if __name__ == '__main__':
        app = wx.App()  # 執行wx.App()方法。認為窗體是一個獨立執行的app,所以要定義一個app的程式類來讓窗體執行,呼叫wx類庫對應的App方法來生成應用程式的類物件:wx.App()
        frame = PDFExtractor(None)  # 呼叫Frame類,並且不指定父類,當前就成為父類
        frame.Show()  # 執行展示介面的方法Show()
        app.MainLoop()  # 進入程式wx.App()迴圈
    
  • wxFormBuilder配置效果

  • 執行效果

3.參考文章

  • 【python012】Python根據頁碼處理PDF檔案的內容

相關文章