最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2025年02月24日 08:26:35   作者:winfredzhang  
在日常工作中,我們經(jīng)常需要從PDF文檔中提取文本內(nèi)容,雖然市面上有不少相關工具,但它們要么功能過于復雜,要么使用不夠方便,本文將介紹如何使用Python開發(fā)一個簡單實用的PDF文本提取工具,需要的朋友可以參考下

引言

在日常工作中,我們經(jīng)常需要從PDF文檔中提取文本內(nèi)容。雖然市面上有不少相關工具,但它們要么功能過于復雜,要么使用不夠方便。本文將介紹如何使用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='結(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é)束頁碼', '錯誤', 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)}', '錯誤', 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é)果

技術選型

基于上述需求,我們選擇以下技術棧:

  • 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ū)域(開始頁碼和結(jié)束頁碼)
  • 生成按鈕
  • 狀態(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 轉(zhuǎn)換功能實現(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)容前添加了頁碼標記,方便閱讀。

異常處理

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

  1. 文件選擇驗證
  2. 頁碼范圍驗證
  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)}', '錯誤', wx.OK | wx.ICON_ERROR)

運行效果

程序運行后會顯示一個簡潔的窗口,用戶可以:

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

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

優(yōu)化建議

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

運行結(jié)果

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

相關文章

最新評論

岚皋县| 藁城市| 射阳县| 江川县| 阿克陶县| 徐水县| 大渡口区| 石嘴山市| 菏泽市| 昆山市| 东城区| 屏东市| 德令哈市| 武邑县| 黄骅市| 门源| 蒲城县| 广西| 攀枝花市| 民乐县| 炉霍县| 梁山县| 和林格尔县| 交城县| 高台县| 丰镇市| 青神县| 海阳市| 霍州市| 眉山市| 且末县| 玉环县| 鱼台县| 军事| 宣城市| 吉木乃县| 绥芬河市| 祥云县| 巩义市| 张家川| 成武县|