Python利用PyMuPDF模塊實現(xiàn)快速轉換PDF文件
解決問題
有時候?qū)⑽臋n上傳Claude2做分析,有大小限制,所以需要切割pdf文檔為幾個小點的文檔,故才有了本文章。
如何用Python和PyMuPDF制作你想要大小的PDF?
PDF是一種廣泛使用的文件格式,可以在任何設備上查看和打印。但是,有時您可能只需要查看PDF文件中的前幾頁,而不是整個文件。在這種情況下,將PDF文件轉換為只包含指定頁數(shù)的新文件可能是有用的。本文將介紹如何使用Python和PyMuPDF模塊來實現(xiàn)此任務。
安裝PyMuPDF模塊
在使用PyMuPDF之前,我們需要先安裝它??梢允褂靡韵旅顏戆惭bPyMuPDF:
pip install PyMuPDF
導入PyMuPDF和wxPython模塊
接下來,我們需要導入PyMuPDF和wxPython模塊:
import fitz import wx
創(chuàng)建GUI界面
為了方便用戶輸入PDF文件和頁碼數(shù)量,我們將創(chuàng)建一個簡單的GUI界面。我們將使用wxPython模塊來創(chuàng)建GUI界面。以下是代碼示例:
class PDFExtractorFrame(wx.Frame): def __init__(self, *args, **kw): super(PDFExtractorFrame, self).__init__(*args, **kw) panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) self.file_picker = wx.FilePickerCtrl(panel, message="選擇PDF文件", wildcard="PDF Files (*.pdf)|*.pdf", style=wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL) vbox.Add(self.file_picker, 0, wx.EXPAND | wx.ALL, 10) self.page_input = wx.TextCtrl(panel, value="1", style=wx.TE_PROCESS_ENTER) vbox.Add(self.page_input, 0, wx.EXPAND | wx.ALL, 10) extract_button = wx.Button(panel, label="提取", size=(70, 30)) extract_button.Bind(wx.EVT_BUTTON, self.on_extract) vbox.Add(extract_button, 0, wx.ALIGN_CENTER | wx.ALL, 10) panel.SetSizer(vbox) self.Bind(wx.EVT_TEXT_ENTER, self.on_extract, self.page_input)
此代碼創(chuàng)建一個名為PDFExtractorFrame的wx.Frame類,并在其構造函數(shù)中創(chuàng)建GUI界面元素。它創(chuàng)建了一個wx.Panel對象和兩個wx.BoxSizer對象來放置GUI元素。在此GUI界面中,用戶可以選擇PDF文件和輸入要保留的頁碼數(shù)量。
實現(xiàn)轉換功能
接下來,我們需要實現(xiàn)轉換功能。我們將使用PyMuPDF模塊來打開PDF文件,并使用它來復制指定數(shù)量的頁面。以下是代碼示例:
def extract_pages(self, input_pdf, page_number, output_pdf): # 打開PDF文檔 pdf_document = fitz.open(input_pdf) total_pages = pdf_document.page_count # 確保頁碼不超過文檔的總頁數(shù) page_number = min(page_number, total_pages) # 創(chuàng)建新的PDF文檔,只包含指定頁碼之前的內(nèi)容 pdf_writer = fitz.open() for page in range(page_number): pdf_writer.insert_pdf(pdf_document, from_page=page, to_page=page) # 保存新的PDF文檔到指定路徑 pdf_writer.save(output_pdf) pdf_writer.close() pdf_document.close()
此代碼使用PyMuPDF模塊將PDF文件轉換為只包含前N頁的新PDF文件的函數(shù)。該函數(shù)將源PDF文件路徑,要提取的頁數(shù)和新PDF文件的輸出路徑作為參數(shù),并返回無返回值。以下是該函數(shù)的詳細說明:
- input_pdf: 源PDF文件的路徑。
- page_number: 要提取的頁數(shù)。
- output_pdf: 新PDF文件的輸出路徑。
該函數(shù)使用fitz.open()函數(shù)打開輸入PDF文件并獲取其總頁數(shù)。如果指定的頁碼數(shù)量超過文檔的總頁數(shù),則將其設置為文檔的總頁數(shù)。
在創(chuàng)建新的PDF文檔之前,該函數(shù)創(chuàng)建一個空的PDF文檔對象。然后,它使用insert_pdf()函數(shù)從源PDF文件中復制每個頁面,并將其插入到新的PDF文檔對象中。該函數(shù)只復制指定數(shù)量的頁面。
最后,該函數(shù)使用save()函數(shù)將新PDF文檔保存到指定的輸出路徑,并使用close()函數(shù)關閉所有打開的PDF文檔對象以釋放資源。
運行應用程序
完整代碼
import fitz # PyMuPDF import wx class PDFExtractorApp(wx.App): def OnInit(self): self.frame = PDFExtractorFrame(None, title="PDF頁面提取工具") self.SetTopWindow(self.frame) self.frame.Show() return True class PDFExtractorFrame(wx.Frame): def __init__(self, *args, **kw): super(PDFExtractorFrame, self).__init__(*args, **kw) panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) self.file_picker = wx.FilePickerCtrl(panel, message="選擇PDF文件", wildcard="PDF Files (*.pdf)|*.pdf", style=wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL) vbox.Add(self.file_picker, 0, wx.EXPAND | wx.ALL, 10) self.page_input = wx.TextCtrl(panel, value="1", style=wx.TE_PROCESS_ENTER) vbox.Add(self.page_input, 0, wx.EXPAND | wx.ALL, 10) extract_button = wx.Button(panel, label="提取", size=(70, 30)) extract_button.Bind(wx.EVT_BUTTON, self.on_extract) vbox.Add(extract_button, 0, wx.ALIGN_CENTER | wx.ALL, 10) panel.SetSizer(vbox) self.Bind(wx.EVT_TEXT_ENTER, self.on_extract, self.page_input) def on_extract(self, event): input_pdf = self.file_picker.GetPath() output_pdf = "output.pdf" try: page_number = int(self.page_input.GetValue()) self.extract_pages(input_pdf, page_number, output_pdf) wx.MessageBox("PDF頁面提取完成!", "成功", wx.OK | wx.ICON_INFORMATION) except ValueError: wx.MessageBox("無效的頁碼輸入!", "錯誤", wx.OK | wx.ICON_ERROR) def extract_pages(self, input_pdf, page_number, output_pdf): # 打開PDF文檔 pdf_document = fitz.open(input_pdf) total_pages = pdf_document.page_count # 確保頁碼不超過文檔的總頁數(shù) page_number = min(page_number, total_pages) # 創(chuàng)建新的PDF文檔,只包含指定頁碼之前的內(nèi)容 pdf_writer = fitz.open() for page in range(page_number): pdf_writer.insert_pdf(pdf_document, from_page=page, to_page=page) # 保存新的PDF文檔到指定路徑 pdf_writer.save(output_pdf) pdf_writer.close() pdf_document.close() if __name__ == '__main__': app = PDFExtractorApp() app.MainLoop()
以上就是Python利用PyMuPDF模塊實現(xiàn)快速轉換PDF文件的詳細內(nèi)容,更多關于Python PyMuPDF轉換PDF的資料請關注腳本之家其它相關文章!
相關文章
Python使用openpyxl批量處理數(shù)據(jù)
openpyxl 是一個用于處理 xlsx 格式Excel表格文件的第三方python庫,其支持Excel表格絕大多數(shù)基本操作。本文給大家介紹Python使用openpyxl批量處理數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧2021-06-06使用Python paramiko模塊利用多線程實現(xiàn)ssh并發(fā)執(zhí)行操作
ssh是一個協(xié)議,OpenSSH是其中一個開源實現(xiàn),paramiko是Python的一個庫,實現(xiàn)了SSHv2協(xié)議(底層使用cryptography)。這篇文章主要介紹了使用Python paramiko模塊利用多線程實現(xiàn)ssh并發(fā)執(zhí)行操作,需要的朋友可以參考下2019-12-12python被修飾的函數(shù)消失問題解決(基于wraps函數(shù))
這篇文章主要介紹了python被修飾的函數(shù)消失問題解決(基于wraps函數(shù)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11