使用Python開發(fā)一個(gè)PDF文本提取工具
引言
在日常工作中,我們經(jīng)常需要從PDF文檔中提取文本內(nèi)容。雖然市面上有不少相關(guān)工具,但它們要么功能過于復(fù)雜,要么使用不夠方便。本文將介紹如何使用Python開發(fā)一個(gè)簡單實(shí)用的PDF文本提取工具,該工具具有圖形界面,操作簡單直觀。
C:\pythoncode\new\GetTxtFromPdfFromX2Y.py
全部代碼
import wx import PyPDF2 import os class PDFConverterFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='PDF to TXT Converter', size=(500, 300)) self.pdf_path = '' self.initUI() def initUI(self): panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) # 文件選擇按鈕 file_btn = wx.Button(panel, label='選擇PDF文件') file_btn.Bind(wx.EVT_BUTTON, self.onChooseFile) vbox.Add(file_btn, 0, wx.ALL | wx.CENTER, 5) # 顯示所選文件路徑 self.path_text = wx.TextCtrl(panel, style=wx.TE_READONLY) vbox.Add(self.path_text, 0, wx.ALL | wx.EXPAND, 5) # 頁面范圍輸入 hbox1 = wx.BoxSizer(wx.HORIZONTAL) start_label = wx.StaticText(panel, label='開始頁碼:') self.start_page = wx.SpinCtrl(panel, value='1', min=1) end_label = wx.StaticText(panel, label='結(jié)束頁碼:') self.end_page = wx.SpinCtrl(panel, value='1', min=1) hbox1.Add(start_label, 0, wx.ALL | wx.CENTER, 5) hbox1.Add(self.start_page, 0, wx.ALL, 5) hbox1.Add(end_label, 0, wx.ALL | wx.CENTER, 5) hbox1.Add(self.end_page, 0, wx.ALL, 5) vbox.Add(hbox1, 0, wx.ALL | wx.CENTER, 5) # 生成按鈕 generate_btn = wx.Button(panel, label='生成TXT') generate_btn.Bind(wx.EVT_BUTTON, self.onGenerate) vbox.Add(generate_btn, 0, wx.ALL | wx.CENTER, 5) # 狀態(tài)顯示 self.status_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY) vbox.Add(self.status_text, 1, wx.ALL | wx.EXPAND, 5) panel.SetSizer(vbox) self.Centre() def onChooseFile(self, event): with wx.FileDialog(self, "選擇PDF文件", wildcard="PDF files (*.pdf)|*.pdf", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog: if fileDialog.ShowModal() == wx.ID_CANCEL: return self.pdf_path = fileDialog.GetPath() self.path_text.SetValue(self.pdf_path) # 更新最大頁碼 try: with open(self.pdf_path, 'rb') as file: pdf = PyPDF2.PdfReader(file) max_pages = len(pdf.pages) self.start_page.SetMax(max_pages) self.end_page.SetMax(max_pages) self.end_page.SetValue(max_pages) self.status_text.SetValue(f"PDF文件共 {max_pages} 頁") except Exception as e: self.status_text.SetValue(f"讀取PDF文件失敗: {str(e)}") def onGenerate(self, event): if not self.pdf_path: wx.MessageBox('請先選擇PDF文件', '提示', wx.OK | wx.ICON_INFORMATION) return start = self.start_page.GetValue() end = self.end_page.GetValue() if start > end: wx.MessageBox('開始頁碼不能大于結(jié)束頁碼', '錯(cuò)誤', wx.OK | wx.ICON_ERROR) return try: # 生成輸出文件名 output_path = os.path.splitext(self.pdf_path)[0] + '_output.txt' with open(self.pdf_path, 'rb') as file: pdf = PyPDF2.PdfReader(file) with open(output_path, 'w', encoding='utf-8') as output: for page_num in range(start - 1, end): text = pdf.pages[page_num].extract_text() output.write(f'=== 第 {page_num + 1} 頁 ===\n') output.write(text) output.write('\n\n') self.status_text.SetValue(f"轉(zhuǎn)換完成!\n輸出文件保存在: {output_path}") except Exception as e: self.status_text.SetValue(f"轉(zhuǎn)換失敗: {str(e)}") wx.MessageBox(f'轉(zhuǎn)換失敗: {str(e)}', '錯(cuò)誤', wx.OK | wx.ICON_ERROR) if __name__ == '__main__': app = wx.App() frame = PDFConverterFrame() frame.Show() app.MainLoop()
功能需求分析
在開發(fā)之前,我們先明確工具的核心功能需求:
- 提供圖形界面,方便用戶操作
- 支持選擇PDF文件
- 可以指定提取的頁面范圍
- 將提取的文本保存為TXT文件
- 顯示操作狀態(tài)和結(jié)果
技術(shù)選型
基于上述需求,我們選擇以下技術(shù)棧:
- Python: 作為主要開發(fā)語言
- wxPython: 用于開發(fā)圖形界面
- PyPDF2: 用于處理PDF文件
wxPython是一個(gè)功能強(qiáng)大的GUI工具包,它能夠創(chuàng)建原生風(fēng)格的界面,性能好,使用簡單。PyPDF2則是一個(gè)廣受歡迎的PDF處理庫,支持讀取文本、提取頁面等操作。
環(huán)境準(zhǔn)備
在開始開發(fā)之前,需要先安裝必要的庫:
pip install wxPython PyPDF2
詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)
1. 界面設(shè)計(jì)
我們的界面采用垂直布局,從上到下依次包含:
- 文件選擇按鈕
- 文件路徑顯示區(qū)域
- 頁碼范圍輸入?yún)^(qū)域(開始頁碼和結(jié)束頁碼)
- 生成按鈕
- 狀態(tài)顯示區(qū)域
2. 核心代碼實(shí)現(xiàn)
讓我們一步步實(shí)現(xiàn)這個(gè)工具:
2.1 創(chuàng)建主窗口類
class PDFConverterFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='PDF to TXT Converter', size=(500, 300)) self.pdf_path = '' self.initUI()
這是我們的主窗口類,繼承自wx.Frame
。在構(gòu)造函數(shù)中,我們設(shè)置了窗口標(biāo)題和大小,并初始化了UI。
2.2 界面初始化
def initUI(self): panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) # 文件選擇按鈕 file_btn = wx.Button(panel, label='選擇PDF文件') file_btn.Bind(wx.EVT_BUTTON, self.onChooseFile) vbox.Add(file_btn, 0, wx.ALL | wx.CENTER, 5) # 顯示所選文件路徑 self.path_text = wx.TextCtrl(panel, style=wx.TE_READONLY) vbox.Add(self.path_text, 0, wx.ALL | wx.EXPAND, 5)
在初始化界面時(shí),我們使用wx.BoxSizer
來管理布局,這樣可以確保界面元素排列整齊,并且能夠適應(yīng)窗口大小的變化。
2.3 文件選擇功能
def onChooseFile(self, event): with wx.FileDialog(self, "選擇PDF文件", wildcard="PDF files (*.pdf)|*.pdf", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog: if fileDialog.ShowModal() == wx.ID_CANCEL: return self.pdf_path = fileDialog.GetPath() self.path_text.SetValue(self.pdf_path)
文件選擇對話框使用wx.FileDialog
實(shí)現(xiàn),我們設(shè)置了文件過濾器,只顯示PDF文件。當(dāng)用戶選擇文件后,會更新顯示路徑,并自動(dòng)獲取PDF的頁數(shù)信息。
2.4 轉(zhuǎn)換功能實(shí)現(xiàn)
def onGenerate(self, event): if not self.pdf_path: wx.MessageBox('請先選擇PDF文件', '提示', wx.OK | wx.ICON_INFORMATION) return start = self.start_page.GetValue() end = self.end_page.GetValue() try: output_path = os.path.splitext(self.pdf_path)[0] + '_output.txt' with open(self.pdf_path, 'rb') as file: pdf = PyPDF2.PdfReader(file) with open(output_path, 'w', encoding='utf-8') as output: for page_num in range(start - 1, end): text = pdf.pages[page_num].extract_text() output.write(f'=== 第 {page_num + 1} 頁 ===\n') output.write(text) output.write('\n\n')
轉(zhuǎn)換功能的核心是使用PyPDF2讀取PDF內(nèi)容,然后將文本寫入新的TXT文件。我們在每頁內(nèi)容前添加了頁碼標(biāo)記,方便閱讀。
異常處理
為了提高程序的健壯性,我們添加了完善的異常處理:
- 文件選擇驗(yàn)證
- 頁碼范圍驗(yàn)證
- 文件讀寫異常處理
- PDF解析異常處理
try: # 轉(zhuǎn)換操作 ... except Exception as e: self.status_text.SetValue(f"轉(zhuǎn)換失敗: {str(e)}") wx.MessageBox(f'轉(zhuǎn)換失敗: {str(e)}', '錯(cuò)誤', wx.OK | wx.ICON_ERROR)
運(yùn)行效果
程序運(yùn)行后會顯示一個(gè)簡潔的窗口,用戶可以:
- 點(diǎn)擊"選擇PDF文件"按鈕選擇需要處理的PDF文件
- 輸入需要提取的頁面范圍
- 點(diǎn)擊"生成TXT"按鈕開始轉(zhuǎn)換
- 在狀態(tài)區(qū)域查看轉(zhuǎn)換結(jié)果
生成的TXT文件會自動(dòng)保存在原PDF文件所在的目錄下,文件名為原PDF文件名加上"_output.txt"后綴。
優(yōu)化建議
- 添加進(jìn)度條顯示轉(zhuǎn)換進(jìn)度
- 支持批量處理多個(gè)PDF文件
- 添加文本編碼選項(xiàng)
- 支持更多輸出格式(如Word、HTML等)
- 添加文本提取方式的選項(xiàng)(按段落、按行等)
運(yùn)行結(jié)果
以上就是使用Python開發(fā)一個(gè)PDF文本提取工具的詳細(xì)內(nèi)容,更多關(guān)于Python PDF文本提取的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python多線程并發(fā)實(shí)例及其優(yōu)化
這篇文章主要介紹了python多線程并發(fā)實(shí)例及其優(yōu)化,threading是擴(kuò)展模塊,在thread的基礎(chǔ)上進(jìn)行了封裝及改進(jìn)。所以只需要使用threading這個(gè)模塊就能完成并發(fā)的測試,需要的朋友可以參考下2019-06-06Python matplotlib 繪制雙Y軸曲線圖的示例代碼
Matplotlib是非常強(qiáng)大的python畫圖工具,這篇文章主要介紹了Python matplotlib 繪制雙Y軸曲線圖,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分操作示例
這篇文章主要為大家介紹了Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python畫圖工具M(jìn)atplotlib庫常用命令簡述
這篇文章主要介紹了Python畫圖Matplotlib庫常用命令簡述總結(jié),文中包含詳細(xì)的圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09利用python調(diào)整Excel行高和列寬的操作示例
在Excel中,默認(rèn)的行高和列寬可能不足以完全顯示某些單元格中的內(nèi)容,特別是當(dāng)內(nèi)容較長時(shí),通過調(diào)整行高和列寬,可以確保所有數(shù)據(jù)都能完整顯示,避免內(nèi)容被截?cái)?本文將介紹如何通過Python調(diào)整Excel的行高列寬、或設(shè)置自適應(yīng)行高列寬,需要的朋友可以參考下2024-11-11Python StringIO如何在內(nèi)存中讀寫str
這篇文章主要介紹了python StringIO如何在內(nèi)存中讀寫str,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01