使用Python開發(fā)一個PDF文本提取工具
引言
在日常工作中,我們經常需要從PDF文檔中提取文本內容。雖然市面上有不少相關工具,但它們要么功能過于復雜,要么使用不夠方便。本文將介紹如何使用Python開發(fā)一個簡單實用的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='結束頁碼:')
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('開始頁碼不能大于結束頁碼', '錯誤', 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"轉換完成!\n輸出文件保存在: {output_path}")
except Exception as e:
self.status_text.SetValue(f"轉換失敗: {str(e)}")
wx.MessageBox(f'轉換失敗: {str(e)}', '錯誤', wx.OK | wx.ICON_ERROR)
if __name__ == '__main__':
app = wx.App()
frame = PDFConverterFrame()
frame.Show()
app.MainLoop()
功能需求分析
在開發(fā)之前,我們先明確工具的核心功能需求:
- 提供圖形界面,方便用戶操作
- 支持選擇PDF文件
- 可以指定提取的頁面范圍
- 將提取的文本保存為TXT文件
- 顯示操作狀態(tài)和結果
技術選型
基于上述需求,我們選擇以下技術棧:
- Python: 作為主要開發(fā)語言
- wxPython: 用于開發(fā)圖形界面
- PyPDF2: 用于處理PDF文件
wxPython是一個功能強大的GUI工具包,它能夠創(chuàng)建原生風格的界面,性能好,使用簡單。PyPDF2則是一個廣受歡迎的PDF處理庫,支持讀取文本、提取頁面等操作。
環(huán)境準備
在開始開發(fā)之前,需要先安裝必要的庫:
pip install wxPython PyPDF2
詳細設計和實現(xiàn)
1. 界面設計
我們的界面采用垂直布局,從上到下依次包含:
- 文件選擇按鈕
- 文件路徑顯示區(qū)域
- 頁碼范圍輸入?yún)^(qū)域(開始頁碼和結束頁碼)
- 生成按鈕
- 狀態(tài)顯示區(qū)域
2. 核心代碼實現(xiàn)
讓我們一步步實現(xiàn)這個工具:
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。在構造函數(shù)中,我們設置了窗口標題和大小,并初始化了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)
在初始化界面時,我們使用wx.BoxSizer來管理布局,這樣可以確保界面元素排列整齊,并且能夠適應窗口大小的變化。
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實現(xiàn),我們設置了文件過濾器,只顯示PDF文件。當用戶選擇文件后,會更新顯示路徑,并自動獲取PDF的頁數(shù)信息。
2.4 轉換功能實現(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')
轉換功能的核心是使用PyPDF2讀取PDF內容,然后將文本寫入新的TXT文件。我們在每頁內容前添加了頁碼標記,方便閱讀。
異常處理
為了提高程序的健壯性,我們添加了完善的異常處理:
- 文件選擇驗證
- 頁碼范圍驗證
- 文件讀寫異常處理
- PDF解析異常處理
try:
# 轉換操作
...
except Exception as e:
self.status_text.SetValue(f"轉換失敗: {str(e)}")
wx.MessageBox(f'轉換失敗: {str(e)}', '錯誤', wx.OK | wx.ICON_ERROR)
運行效果
程序運行后會顯示一個簡潔的窗口,用戶可以:
- 點擊"選擇PDF文件"按鈕選擇需要處理的PDF文件
- 輸入需要提取的頁面范圍
- 點擊"生成TXT"按鈕開始轉換
- 在狀態(tài)區(qū)域查看轉換結果
生成的TXT文件會自動保存在原PDF文件所在的目錄下,文件名為原PDF文件名加上"_output.txt"后綴。
優(yōu)化建議
- 添加進度條顯示轉換進度
- 支持批量處理多個PDF文件
- 添加文本編碼選項
- 支持更多輸出格式(如Word、HTML等)
- 添加文本提取方式的選項(按段落、按行等)
運行結果


以上就是使用Python開發(fā)一個PDF文本提取工具的詳細內容,更多關于Python PDF文本提取的資料請關注腳本之家其它相關文章!
相關文章
Python+matplotlib實現(xiàn)計算兩個信號的交叉譜密度實例
這篇文章主要介紹了Python+matplotlib實現(xiàn)計算兩個信號的交叉譜密度實例,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
詳解Python查找算法的實現(xiàn)(線性,二分,分塊,插值)
這篇文章主要為大家介紹了Python中常見的四種查找算法的實現(xiàn):線性、二分、分塊和插值,文中通過圖片詳細講解了它們實現(xiàn)的原理與代碼,需要的可以參考一下2022-04-04
在Linux系統(tǒng)中升級python版本的三種方法
在當今快速發(fā)展的科技領域,Python 作為一種靈活且功能強大的編程語言,已經成為開發(fā)者的首選工具之一,然而,隨著新版本的不斷推出,舊版本的Python可能無法滿足最新的項目需求,本文將詳細介紹如何在Linux系統(tǒng)中安全地升級Python版本,需要的朋友可以參考下2025-06-06
Pycharm+django2.2+python3.6+MySQL實現(xiàn)簡單的考試報名系統(tǒng)
這篇文章主要介紹了Pycharm+django2.2+python3.6+MySQL實現(xiàn)簡單的考試報名系統(tǒng),本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
numpy中meshgrid和mgrid的區(qū)別和使用詳解
本文主要介紹了numpy中meshgrid和mgrid的區(qū)別和使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02

