欧美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)用戶選擇文件后,會更新顯示路徑,并自動(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)行后會顯示一個(gè)簡潔的窗口,用戶可以:

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

生成的TXT文件會自動(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多線程并發(fā)實(shí)例及其優(yōu)化

    python多線程并發(fā)實(shí)例及其優(yōu)化

    這篇文章主要介紹了python多線程并發(fā)實(shí)例及其優(yōu)化,threading是擴(kuò)展模塊,在thread的基礎(chǔ)上進(jìn)行了封裝及改進(jìn)。所以只需要使用threading這個(gè)模塊就能完成并發(fā)的測試,需要的朋友可以參考下
    2019-06-06
  • Python matplotlib 繪制雙Y軸曲線圖的示例代碼

    Python matplotlib 繪制雙Y軸曲線圖的示例代碼

    Matplotlib是非常強(qiáng)大的python畫圖工具,這篇文章主要介紹了Python matplotlib 繪制雙Y軸曲線圖,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分操作示例

    Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分操作示例

    這篇文章主要為大家介紹了Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python畫圖工具M(jìn)atplotlib庫常用命令簡述

    Python畫圖工具M(jìn)atplotlib庫常用命令簡述

    這篇文章主要介紹了Python畫圖Matplotlib庫常用命令簡述總結(jié),文中包含詳細(xì)的圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • 利用python調(diào)整Excel行高和列寬的操作示例

    利用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-11
  • Python混合使用同步和異步函數(shù)的方法

    Python混合使用同步和異步函數(shù)的方法

    Python是一種非常靈活的編程語言,可以混合使用同步和異步函數(shù)來實(shí)現(xiàn)更高效的編程。本文將介紹如何在Python中混合使用同步和異步函數(shù),以及如何在不同場景下選擇合適的函數(shù),感興趣的可以了解一下
    2023-03-03
  • Python StringIO如何在內(nèi)存中讀寫str

    Python StringIO如何在內(nèi)存中讀寫str

    這篇文章主要介紹了python StringIO如何在內(nèi)存中讀寫str,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python實(shí)現(xiàn)k-means算法

    Python實(shí)現(xiàn)k-means算法

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)k-means算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Django中的ORM詳解(最新推薦)

    Django中的ORM詳解(最新推薦)

    Django ORM是一種用于操作數(shù)據(jù)庫的高級工具,它允許開發(fā)者通過Python代碼來管理數(shù)據(jù)庫模型和執(zhí)行查詢,而無需直接編寫SQL語句,ORM的主要優(yōu)勢是提高了開發(fā)效率,但也會犧牲一定的執(zhí)行效率,本文介紹Django的ORM詳解,感興趣的朋友一起看看吧
    2025-03-03
  • Python中subprocess的簡單使用示例

    Python中subprocess的簡單使用示例

    這篇文章主要介紹了Python中subprocess的簡單使用示例,是Python進(jìn)程方面處理的相關(guān)重要知識,需要的朋友可以參考下
    2015-07-07

最新評論