欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python開發(fā)一個(gè)PDF文本提取工具

 更新時(shí)間:2025年02月24日 08:26:35   作者:winfredzhang  
在日常工作中,我們經(jīng)常需要從PDF文檔中提取文本內(nèi)容,雖然市面上有不少相關(guān)工具,但它們要么功能過于復(fù)雜,要么使用不夠方便,本文將介紹如何使用Python開發(fā)一個(gè)簡單實(shí)用的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ā)之前,我們先明確工具的核心功能需求:

  1. 提供圖形界面,方便用戶操作
  2. 支持選擇PDF文件
  3. 可以指定提取的頁面范圍
  4. 將提取的文本保存為TXT文件
  5. 顯示操作狀態(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)用戶選擇文件后,會(huì)更新顯示路徑,并自動(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)記,方便閱讀。

異常處理

為了提高程序的健壯性,我們添加了完善的異常處理:

  1. 文件選擇驗(yàn)證
  2. 頁碼范圍驗(yàn)證
  3. 文件讀寫異常處理
  4. 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)行后會(huì)顯示一個(gè)簡潔的窗口,用戶可以:

  1. 點(diǎn)擊"選擇PDF文件"按鈕選擇需要處理的PDF文件
  2. 輸入需要提取的頁面范圍
  3. 點(diǎn)擊"生成TXT"按鈕開始轉(zhuǎn)換
  4. 在狀態(tài)區(qū)域查看轉(zhuǎn)換結(jié)果

生成的TXT文件會(huì)自動(dòng)保存在原PDF文件所在的目錄下,文件名為原PDF文件名加上"_output.txt"后綴。

優(yōu)化建議

  1. 添加進(jìn)度條顯示轉(zhuǎn)換進(jìn)度
  2. 支持批量處理多個(gè)PDF文件
  3. 添加文本編碼選項(xiàng)
  4. 支持更多輸出格式(如Word、HTML等)
  5. 添加文本提取方式的選項(xiàng)(按段落、按行等)

運(yùn)行結(jié)果

以上就是使用Python開發(fā)一個(gè)PDF文本提取工具的詳細(xì)內(nèi)容,更多關(guān)于Python PDF文本提取的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python headers請求頭如何實(shí)現(xiàn)快速添加

    Python headers請求頭如何實(shí)現(xiàn)快速添加

    這篇文章主要介紹了Python headers請求頭如何實(shí)現(xiàn)快速添加,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python內(nèi)建類型list源碼學(xué)習(xí)

    Python內(nèi)建類型list源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python內(nèi)建類型list源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python 內(nèi)置方法和屬性詳解

    Python 內(nèi)置方法和屬性詳解

    這篇文章主要為大家介紹了Python 內(nèi)置方法和屬性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python實(shí)現(xiàn)的當(dāng)前時(shí)間多加一天、一小時(shí)、一分鐘操作示例

    Python實(shí)現(xiàn)的當(dāng)前時(shí)間多加一天、一小時(shí)、一分鐘操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的當(dāng)前時(shí)間多加一天、一小時(shí)、一分鐘操作,結(jié)合實(shí)例形式分析了Python基于datetime模塊進(jìn)行日期時(shí)間操作相關(guān)使用技巧,需要的朋友可以參考下
    2018-05-05
  • python配置文件寫入過程詳解

    python配置文件寫入過程詳解

    這篇文章主要介紹了python配置文件寫入過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Ubuntu權(quán)限不足無法創(chuàng)建文件夾解決方案

    Ubuntu權(quán)限不足無法創(chuàng)建文件夾解決方案

    這篇文章主要介紹了Ubuntu權(quán)限不足無法創(chuàng)建文件夾解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python使用FastMCP實(shí)現(xiàn)Word文檔與JSON數(shù)據(jù)互轉(zhuǎn)

    Python使用FastMCP實(shí)現(xiàn)Word文檔與JSON數(shù)據(jù)互轉(zhuǎn)

    這篇文章主要介紹了基于FastMCP框架實(shí)現(xiàn)的文檔處理服務(wù),可實(shí)現(xiàn)?Word?文檔(.docx)與?JSON?數(shù)據(jù)格式的雙向轉(zhuǎn)換,通過此服務(wù),開發(fā)者可以輕松實(shí)現(xiàn)文檔內(nèi)容提取、結(jié)構(gòu)化數(shù)據(jù)填充、樣式模板復(fù)用等功能,適用于自動(dòng)化報(bào)告生成、數(shù)據(jù)導(dǎo)入導(dǎo)出等場景,需要的朋友可以參考下
    2025-06-06
  • Django利用Channels+websocket開發(fā)聊天室完整案例

    Django利用Channels+websocket開發(fā)聊天室完整案例

    Channels是Django團(tuán)隊(duì)研發(fā)的一個(gè)給Django提供websocket支持的框架,使用它我們可以輕松開發(fā)需要長鏈接的實(shí)時(shí)通訊應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Django利用Channels+websocket開發(fā)聊天室的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 使用Python解析PPT文件并生成JSON結(jié)構(gòu)詳解

    使用Python解析PPT文件并生成JSON結(jié)構(gòu)詳解

    PowerPoint(PPT)文件的自動(dòng)化處理是辦公自動(dòng)化和數(shù)據(jù)提取的常見需求,本文將介紹如何通過Python的python-pptx庫,將PPT文件的樣式、結(jié)構(gòu)、文本內(nèi)容等信息解析為標(biāo)準(zhǔn)化的JSON格式,為后續(xù)的自動(dòng)化處理、數(shù)據(jù)遷移或樣式復(fù)用提供基礎(chǔ),需要的朋友可以參考下
    2025-04-04
  • 深入理解Python虛擬機(jī)中列表(list)的實(shí)現(xiàn)原理及源碼剖析

    深入理解Python虛擬機(jī)中列表(list)的實(shí)現(xiàn)原理及源碼剖析

    在本篇文章當(dāng)中主要給大家介紹?cpython?虛擬機(jī)當(dāng)中針對列表的實(shí)現(xiàn),在?Python?中,List?是一種非常常用的數(shù)據(jù)類型,可以存儲(chǔ)任何類型的數(shù)據(jù),并且支持各種操作,如添加、刪除、查找、切片等,在本篇文章當(dāng)中將深入去分析這一點(diǎn)是如何實(shí)現(xiàn)的
    2023-03-03

最新評論