Python實現PD文字識別、提取並寫入CSV文件腳本分享

来源:https://www.cnblogs.com/123456feng/archive/2022/03/29/16072644.html
-Advertisement-
Play Games

一、前言 掃描件一直受大眾青睞,任何紙質資料在掃描之後進行存檔,想使用時手機就能打開,省心省力。但是掃描件的優點也恰恰造成了它的一個缺點,因為是通過電子設備掃描,所以出來的是圖像,如果想要處理文件上的內容,直接操作是無法實現的。 那要是想要引用其中的內容怎麼辦呢?別擔心,Python幫你解決問題。 ...


一、前言

掃描件一直受大眾青睞,任何紙質資料在掃描之後進行存檔,想使用時手機就能打開,省心省力。但是掃描件的優點也恰恰造成了它的一個缺點,因為是通過電子設備掃描,所以出來的是圖像,如果想要處理文件上的內容,直接操作是無法實現的。

那要是想要引用其中的內容怎麼辦呢?別擔心,Python幫你解決問題。
在這裡插入圖片描述

二、需求描述

現有一份pdf掃描件,我們想把其中的文字提取出來並且分三列寫入csv文檔,內容及效果如下:
在這裡插入圖片描述

pdfexample
在這裡插入圖片描述

csvexample

在這裡插入圖片描述

三、開始動手動腦

pdf掃描件是文檔掃描成電腦圖片格式後轉化成的,提取其中的文字就相當於識別圖片內的文字。所以,我們的工作就是將pdf轉成圖片,再用ocr工具提取圖片中的文字。

3.1 安裝相關第三方包

pip3 install pdf2image pytesseract

 

3.2 導入需要用到的第三方庫

####Python學習交流群:906715085###
import os   #處理文件
from pdf2image import convert_from_path  # pdf轉圖片
import pytesseract  # 識別圖片文字
import csv  # 處理csv文件

 

3.3 讀取pdf文件,並識別內容

tess_ocr(pdf_path, lang, first_page, last_page)

將pdf文件拆分成圖片,並提取文字寫入文本文件

•pdf_path:pdf文件的存儲路徑

•image:代表PDF文檔每頁的PIL圖像列表

•first_page :允許設置由pdftoppm處理的第一個頁面;

•last_page:允許設置最後一頁由pdftoppm處理

•fmt:允許指定輸出格式。目前支持的格式是jpg、png和ppm;

•output_folder:圖片保存路徑

def tess_ocr(pdf_path, lang,first_page,last_page):

  # 創建一個和pdf同名的文件夾
   
   images = convert_from_path(pdf_path, fmt='png',first_page=first_page,last_page=last_page,output_folder=imagefolder,userpw='site')  # 轉成圖片

  text = ''

  for img in images:   
       text += pytesseract.image_to_string(img, lang=lang) # 識別圖片文字  
       with open(r'example\data.txt' 'a', encoding='utf-8') as f: #寫入txt文件
       f.write(text) 

 

在這裡插入圖片描述

## 運行結果

生成一個同名的文件夾存放拆分的圖片,接著提取圖片文字寫入data.txt
在這裡插入圖片描述

image-20211215201838225
在這裡插入圖片描述

image-20211215212147760

運行問題

問題拋出1:pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

解決措施: 下載 poppler。

1 方法一:設置環境變數 poppler/bin;

2 方法二:參數指定絕對路徑:images = convert_from_path(pdf_path=pdf_file_path, poppler_path=r’poppler中bin文件所在地址’)

問題拋出2:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in your PATH. See README file for more information.

解決措施: 額外下載安裝tesseract-ocr並配置環境變數。

在這裡插入圖片描述

3.4 對識別的數據進行處理,寫入csv文件

modification(infile, outfile)

清洗生成的文本文檔

•infile:需要進行處理的文件地址

•outfile:處理後生成的新文件的地址

def modification(infile, outfile):

  infp = open(infile, "r",encoding='utf-8')

  outfp = open(outfile, "w",encoding='utf-8')

  lines = infp.readlines() #返回列表,包含所有的行。

  #依次讀取每行

  for li in lines:  

    if li.split():             #str.split(str="", num=string.count(str)),過濾文件中的空行  
      # 根據識別情況對數據進行清洗 
      li = li.replace('[', ' ').replace(']', '')  
      outfp.writelines(li)    

  infp.close()

  outfp.close()   

 

運行結果

生成一個新的txt文件,新文件刪除了data.txt中的空行,將原文件中錯誤識別的內容替換成正確的。
在這裡插入圖片描述

image-20211215203123576
在這裡插入圖片描述

image-20211215212227592

writercsv(intxt,outcsv)

將文本文件按空格分列寫入csv表格

•intxt:文本文件地址

•outcsv:新生成的csv文件

def writercsv(intxt,outcsv):
  # 使用newlines=''可保證存儲的數據不空行。
  csvFile = open(outcsv, 'a',newline='', encoding='utf-8')  

  writer = csv.writer(csvFile)

  csvRow = []

  f = open(intxt,'r',encoding='utf-8')

  for line in f:

      csvRow = line.split() #以空格為分隔符
    
      if len(csvRow)>1 and len(csvRow)<=3:  #約束條件,視情況而定
    
         writer.writerow(csvRow)

  f.close()

  csvFile.close()

 

運行結果

生成一個三列csv文件,第一列是英文名,第二列是中文名,第三列是所在國家
在這裡插入圖片描述

image-20211215204846623
在這裡插入圖片描述

image-20211215204941725

總結

通過本次學習實現了從掃描件中提取文字、把內容按要求寫進不同格式的文檔的需求。

最初以為提取pdf的庫也適用於掃描件,嘗試了Pdfplumber庫和PyPDF2庫。

實踐發現Pdfplumber只能識別掃描件pdf中的水印,不適用於掃描件的pdf,而PyPDF2庫運行報錯:NotImplementedError: only algorithm code 1 and 2 are supported。

原因是這個被加密的pdf可能是從高版本的acrobot中來的,所以對應的加密演算法代號為‘4’,然而,現有的pypdf2模塊並只支持加密演算法代號為‘1’或者‘2’的pdf加密文件。

最後,今天的分享到這裡就沒有了,相信到這裡你也已經掌握了,沒有掌握的小伙伴要記得及時提出來,這樣才能更好地解決問題。

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 任務要求 把棋盤當作一個稀疏矩陣,0表示沒棋,1表示黑棋,2表示藍棋。 把該稀疏矩陣壓縮以三元組形式表示並以文件形式保存,再寫另一個程式讀取文件中的信息把壓縮後的三元組還原成原來的稀疏矩陣。 其中三元組的第一行用來存儲原始稀疏矩陣的行數、列數和有效的數據個數,其餘行用來存儲有效的非0數據 思路分析 ...
  • 前言 開發環境 python 3.8pycharm 2021.2 專業版 代碼實現 發送請求 獲取數據 解析數據(篩選數據) 保存數據 連接資料庫 對於本篇文章有疑問的同學可以加【資料白嫖、解答交流群:910981974】 開始代碼 請求數據 # 偽裝 headers = { 'cookie': ' ...
  • 一個簡單的Java程式 // HelloJava.java public class HelloJava { public static void main(String[] args) { System.out.println("Hello Java!"); } } Java是區分大小寫的 關鍵字 ...
  • finally的特點 finally:被finally控制的語句體一定會執行 * 註意:如果在執行到finally之前jvm退出了,就不能執行了。 * * A:格式 * try...catch...finally... * B:用於釋放資源,在IO流操作和資料庫操作中會見到 package cn.i ...
  • 練習: 存儲學生對象並遍歷,創建TreeSet集合使用無參構造方法,並按照年齡從小到大的順序排序,若年齡相同再按照姓名的字母順序排序 分析: 1.創建學生類,成員變數name,age;無參構造,帶參構造;get\set方法; 2.創建測試類,添加數據併進行排序;直接排序會報錯 3.需要Student ...
  • 過濾器就是過濾條件,對已經定位到數組中的 DOM 對象進行過濾篩選,過濾條件不能獨立出現在 jquery 函數,如果使用只能出現在選擇器後方 ...
  • 背景 很多時候,我們項目在開發環境和生成環境的環境配置是不一樣的,例如,資料庫配置,在開發的時候,我們一般用測試資料庫,而在生產環境的時候,我們是用正式的數據,這時候,我們可以利用profile在不同的環境下配置用不同的配置文件或者不同的配置。 解決方案 spring boot允許你通過命名約定按照 ...
  • 程式的異常:Throwable * 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說記憶體溢出。 * 問題:Exception * A:編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。 * B:運行期問題:RuntimeExcep ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...