开发者

使用Python开发一个PDF文本提取工具

目录
  • 引言
  • 全部代码
  • 功能需求分析
  • 技术选型
  • 环境准备
  • 详细设计和实现
    • 1. 界面设计
    • 2. 核心代码实现
      • 2.1 创建主窗口类
      • 2.2 界面初始化
      • 2.3 文件选择功能
      • 2.4 转换功能实现
  • 异常处理
    • 运行效果
      • 优化建议
        • 运行结果

          引言

          在日常工作中,我们经常需要从PDF文档中提取文本内容。虽然市面上有不少相关工具,但它们要么功能过于复杂,要么使用不够方便。本文将介绍如何使用python开发一个简单实用的PDF文本提取工具,该工具具有图形界面,操作简单直观。

          C:\pythoncode\new\GetTxtFromPdfFromX2Y.py

          全部代码

          import wx
          import PyPDF2
          import os
          
          class PDFConverterFrame(wx.Frame):
              def __init__(self):
                  super().__init__(parent=None, title="使用Python开发一个PDF文本提取工具", 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_labejavascriptl, 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)
                  
                  # 状态显示
                  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.pythonpdf_path, 'rb') as file:
                              pdf = PyPDF2.PdfReader(file)
                              max_pages = len(pdf.pages)
                              self.s编程tart_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()
          

          功能需求分析

          在开发之前,我们先明确工具的核心功能需求:

          1. 提供图形界面,方便用户操作
          2. 支持选择PDF文件
          3. 可以指定提取的页面范围
          4. 将提取的文本保存为TXT文件
          5. 显示操作状态和结果

          技术选型

          基于上述需求,我们选择以下技术栈:

          • Python: 作为主要开发语言
          • wxPython: 用于开发图形界面
          • PyPDF2: 用于处理PDF文件

          wxPython是一个功能强大的GUI工具包,它能够创建原生风格的界面,性能好,使用简单。PyPDF2则是一个广受欢迎的PDF处理库,支持读取文本、提取页面等操作。

          环境准备

          在开始开发之前,需要先安装必要的库:

          pip install wxPython PyPDF2
          

          详细设计和实现

          1. 界面设计

          我们的界面采用垂直布局,从上到下依次包含:

          • 文件选择按钮
          • 文件路径显示区域
          • 页码范围输入区域(开始页码和结束页码)
          • 生成按钮
          • 状态显示区域

          2. 核心代码实现

          让我们一步步实现这个工具:

          2.1 创建主窗口类

          class PDFConverterFrame(wx.Frame):
              def __init__(self):
                  super().__init__(parent=None, title="使用Python开发一个PDF文本提取工具", size=(500, 300))
                  self.pdf_path = ''
                  self.initUI()
          

          这是我们的主窗口类,继承自wx.Frame。在构造函数中,我们设置了窗口标题和大小,并初始化了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实现,我们设置了文件过滤器,只显示PDF文件。当用户选择文件后,会更新显示路径,并自动获取PDF的页数信息。

          2.4 转换功能实现

          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} 页 ===js\n')
                              output.write(text)
                              output.write('\n\n')
          

          转换功能的核心是使用PyPDF2读取PDF内容,然后将文本写入新的TXT文件。我们在每页内容前添加了页码标记,方便阅读。

          异常处理

          为了提高程序的健壮性,我们添加了完善的异常处理:

          1. 文件选择验证
          2. 页码范围验证
          3. 文件读写异常处理
          4. PDF解析异常处理
          try:
              # 转换操作
              ...
          except Exception as e:
              self.status_text.SetValue(f"转换失败: {str(e)}")
              wx.MessageBox(f'转换失败: {str(e)}', '错误', wx.OK | wx.ICON_ERROR)
          

          运行效果

          程序运行后会显示一个简洁的窗口,用户可以:

          1. 点击"选择PDF文件"按钮选择需要处理的PDF文件
          2. 输入需要提取的页面范围
          3. 点击"生成TXT"按钮开始转换
          4. 在状态区域查看转换结果

          生成的TXT文件会自动保存在原PDF文件所在的目录下,文件名为原PDF文件名加上"_output.txt"后缀。

          优化建议

          1. 添加进度条显示转换进度
          2. 支持批量处理多个PDF文件
          3. 添加文本编码选项
          4. 支持更多输出格式(如Word、html等)
          5. 添加文本提取方式的选项(按段落、按行等)

          运行结果

          使用Python开发一个PDF文本提取工具

          使用Python开发一个PDF文本提取工具

          以上就是使用Python开发一个PDF文本提取工具的详细内容,更多关于Python PDF文本提取的资料请关注编程客栈(www.devze.com)其它相关文章!

          0

          上一篇:

          下一篇:

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          最新开发

          开发排行榜