<address id="zhpbl"></address>
<noframes id="zhpbl">
<address id="zhpbl"><form id="zhpbl"><th id="zhpbl"></th></form></address>

    <em id="zhpbl"></em>

      <address id="zhpbl"><th id="zhpbl"><progress id="zhpbl"></progress></th></address>
      更多精彩內容,歡迎關注:

      視頻號
      視頻號

      抖音
      抖音

      快手
      快手

      微博
      微博

      基于Python實現PDF區域文本提取工具

      導讀這篇文章主要為大家介紹了如何通過Python實現一個非常精簡的圖像化的PDF區域選擇提取工具,文中示例代碼講解詳細,希望對大家能有所幫助。
      功能簡介

      打開軟件后界面如下:

      點擊打開文件按鈕打開之前的PDF文件后效果如下:

      框選區域后,標題欄會自動顯示當前框選的區域提取到的文字,還可以左右按鈕切換:

      實際我們需要提取文字的區域可能不止這一個,所以程序支持多區域框選:

      完成區域框選后就可以點擊保存文件,將PDF每頁提取到的文本保存到一個csv文件中,當前選區的保存結果如下:

      可以看到已經按框選順序依次保存了每一個區域的字符串。

      如果選擇區域時發現提取結果不準確,可以撤銷后重新選擇:

      保存圖片則會將PDF的每頁的整體保存為一張圖片,未選擇區域時,以頁碼為文件名保存圖片:

      選擇區域時,會自動提取最后一個區域提取的文本作為當前頁的文件名:

      開發代碼

      當然這個項目由于本人是一次使用wxpython,功能非常簡約,現在將完整代碼開源出來期待各位大佬的改進。

      源碼和已編譯工具下載地址:

      https://codechina.csdn.net/as604049322/python_gui

      完整代碼:

      """
      小小明的代碼
      CSDN主頁:https://blog.csdn.net/as604049322
      """
      __author__?=?'小小明'
      __time__?=?'2021/11/24'
      
      import?csv
      
      import?wx
      import?os
      import?fitz
      
      
      class?MyCanvas(wx.Panel):
      ????def?__init__(self,?parent):
      ????????wx.Panel.__init__(self,?parent)
      ????????self.parent?=?parent
      ????????self.rects?=?[]
      ????????self.Bind(wx.EVT_LEFT_DOWN,?self.OnLeftButtonEvent)
      ????????self.Bind(wx.EVT_LEFT_UP,?self.OnLeftButtonEvent)
      ????????self.Bind(wx.EVT_MOTION,?self.OnLeftButtonEvent)
      ????????self.Bind(wx.EVT_PAINT,?self.DoDrawing)
      ????????b?=?wx.Button(self,?-1,?"打開文件",?(0,?0))
      ????????self.Bind(wx.EVT_BUTTON,?self.OnButton,?b)
      ????????b?=?wx.Button(self,?-1,?"保存文件",?(75,?0))
      ????????self.Bind(wx.EVT_BUTTON,?self.save_file,?b)
      ????????b?=?wx.Button(self,?-1,?"保存圖片",?(150,?0))
      ????????self.Bind(wx.EVT_BUTTON,?self.save_img,?b)
      ????????b?=?wx.Button(self,?-1,?"撤銷選區",?(225,?0))
      ????????self.Bind(wx.EVT_BUTTON,?self.back_select,?b)
      
      ????????b?=?wx.Button(self,?-1,?"《",?(300,?0),?size=(25,?25))
      ????????self.Bind(wx.EVT_BUTTON,?self.previous,?b)
      ????????b?=?wx.Button(self,?-1,?"》",?(325,?0),?size=(25,?25))
      ????????self.Bind(wx.EVT_BUTTON,?self.next,?b)
      
      ????????self.g1?=?wx.Gauge(self,?-1,?100,?(0,?30),?(-1,?100),?wx.GA_VERTICAL)
      
      ????def?previous(self,?evt):
      ????????if?not?hasattr(self,?"pdfDoc"):
      ????????????return
      ????????if?self.i?>?0:
      ????????????self.i?-=?1
      ????????????self.change_pdf_page(self.i,?False)
      ????????????self.DoDrawing(-1)
      ????????????if?self.rects:
      ????????????????self.parent.SetTitle(self.path?+?"|"?+?self.extract_pdf_text())
      
      ????def?next(self,?evt):
      ????????if?not?hasattr(self,?"pdfDoc"):
      ????????????return
      ????????if?self.i?3d}"
      ????????????????pix.save(f"{path}/{name}.png")
      ????????????????self.g1.SetValue((i?+?1)?*?100?//?self.pdfDoc.pageCount)
      ????????dlg.Destroy()
      ????????os.system(f"explorer?{path}")
      
      ????def?save_file(self,?evt):
      ????????if?not?hasattr(self,?"pdfDoc"):
      ????????????return
      ????????path?=?self.save_FileDialog()
      ????????if?path?is?None:
      ????????????return
      ????????data?=?[]
      ????????for?i?in?range(self.pdfDoc.pageCount):
      ????????????page?=?self.pdfDoc[i]
      ????????????row?=?[self.extract_pdf_text(page,?rect)
      ???????????????????for?i,?rect?in?enumerate(self.rects)]
      ????????????data.append(row)
      ????????with?open(path,?"w")?as?f:
      ????????????writer?=?csv.writer(f,?lineterminator="\n")
      ????????????row?=?[f"區域{i}"?for?i?in?range(1,?len(row)?+?1)]
      ????????????writer.writerow(row)
      ????????????for?row?in?data:
      ????????????????writer.writerow(row)
      ????????os.system(f"cmd?/c?start?{path}")
      
      ????def?extract_pdf_text(self,?page=None,?rect=None):
      ????????if?page?is?None:
      ????????????page?=?self.pdfDoc[self.i]
      ????????if?rect?is?None:
      ????????????rect?=?self.rects[-1]
      ????????a,?b,?c,?d?=?rect
      ????????clip?=?fitz.Rect(a,?b,?a?+?c,?b?+?d)
      ????????text?=?page.get_text(clip=clip).strip()
      ????????return?text
      
      ????def?change_img(self,?img_path,?move=True):
      ????????self.bmp?=?wx.Bitmap(img_path)
      ????????self.SetSize(self.bmp.GetSize())
      ????????self.parent.SetSize(self.parent.GetBestSize())
      ????????if?move:
      ????????????self.parent.Center()
      
      ????def?DoDrawing(self,?evt):
      ????????if?not?hasattr(self,?"bmp"):
      ????????????return
      ????????dc?=?wx.ClientDC(self)
      ????????dc.DrawBitmap(self.bmp,?0,?0,?True)
      ????????dc.SetPen(wx.Pen('blue'))
      ????????dc.SetBrush(wx.Brush('white',?wx.BRUSHSTYLE_TRANSPARENT))
      ????????dc.DrawRectangleList(self.rects)
      
      ????def?OnLeftButtonEvent(self,?event):
      ????????if?event.LeftDown():
      ????????????self.x,?self.y?=?event.GetPosition()
      ????????????self.rects.append([self.x,?self.y,?0,?0])
      ????????elif?event.Dragging():
      ????????????x,?y?=?event.GetPosition()
      ????????????self.rects[-1][2]?=?x?-?self.x
      ????????????self.rects[-1][3]?=?y?-?self.y
      ????????????self.DoDrawing(-1)
      ????????elif?event.LeftUp():
      ????????????print(self.rects)
      ????????????if?self.rects[-1][2]?

      為你推薦
      資訊專欄
      熱門視頻
      相關推薦
      詳解python的循環 python實現新年倒計時實例代碼 Python實現消消樂小游戲 學習python的while循環嵌套 提升Python運行速度的5個小技巧 Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 信息系統項目管理師報考條件 信息系統項目管理師報考時間 信息系統項目管理師報名時間 信息系統項目管理師考試時間 pmp與信息系統項目管理師 信息系統項目管理師報考要求 信息系統項目管理師有效期 信息系統項目管理師考什么論文 信息系統項目管理師是什么類別 軟考信息系統項目管理師怎么備考 備考流程有哪些 考信息系統項目管理師需要考幾門 Python數據分析處理(三)--運動員信息的分組與聚合 Python實現城市公交網絡分析與可視化 Python&nbsp;垃圾回收機制詳解 python正則表達式語法學習筆記 一文秒懂python正則表達式常用函數 Python常用的正則表達式處理函數詳解 JS截取字符串的三種方法詳解 PHP遍歷數組的6種方式總結 php兩種基本的輸出方及實例詳解 php生成唯一uid的解決方法詳解 PHP7中對十六進制字符串處理的問題詳解 PHP對接抖音開發平臺接口的詳細教程 php7安裝mysqli實例講解 php去掉一維數組的鍵值的實例方法 PHP中empty()和isset()的區別介紹 PHP實現JWT的Token登錄認證 php判斷時間戳是否為今天實例講解 PHP7 preg_replace出錯及解決辦法 五年班的學習計劃怎么寫 五年級的學習計劃 初中新學期學習計劃怎么寫
      Top 少妇高潮太爽了在线视频