Python利用cnocr庫實現(xiàn)pdf文件的文字識別
很多pdf文件文字識別軟件都會收費,免費的網(wǎng)頁版可能會帶來信息泄露,還有一些類似于騰訊AI和百度AI的接口都有調(diào)用次數(shù)限制,因此,利用識別正確率極高且免費的cnocr庫來自己動手做個pdf文件文字識別程序就是一個很不錯的選擇。以下程序利用pymupdf打開pdf文件并將頁面圖像數(shù)據(jù)讀出,然后用numpy將pymupdf讀取的頁面圖像轉(zhuǎn)換為cnocr能夠接受的np.ndarray格式的圖像數(shù)據(jù),再由cnocr進行文字識別。numpy、pymupdf和cnocr庫的安裝都可以用pip install指令簡單完成,不多贅述。
import numpy as np from cnocr import CnOcr from pymupdf import pymupdf def pdf2txt(input_file, output_file, start_page=0, page_count=-1): """ 將掃描的pdf文件中指定的頁面范圍內(nèi)的內(nèi)容轉(zhuǎn)換成文本文件 :param input_file: 要識別的pdf文件的相對或絕對路徑,包含文件名的字符串 :param output_file: 保存識別結果的txt文件的相對或絕對路徑 :param start_page: 識別起始頁面,默認為第1頁 :param page_count: 識別的頁數(shù),默認為所有頁面 :return: """ pdf = pymupdf.open(input_file) count = pdf.page_count if start_page < 0: start_page = 0 if page_count < 0 or page_count + start_page > count: end_page = count else: end_page = page_count + start_page # 如CnOcr的識別模型尚未下載,以下語句執(zhí)行時CnOcr會自動下載模型并解壓到用戶目錄下的AppData\\Roaming\\cnocr\\cnocr版本號下 # 也可以在初始化時指定rec_model_fp參數(shù)給出模型所在的相對路徑或絕對路徑指定識別模型,如以下示例(因以下路徑是我的電腦上的默認路徑, # 因此下面兩行代碼與ocr = CnOcr()完全等價 ocr = CnOcr(rec_model_fp='C:\\Users\\asus\\AppData\\Roaming\\cnocr\\2.3\\densenet_lite_136-gru' '\\cnocr-v2.3-densenet_lite_136-gru-epoch=004-ft-model.onnx') print(start_page, end_page) with open(output_file, 'w', encoding='utf-8') as f: for i in range(start_page, end_page): page = pdf[i] pix = page.get_pixmap() width = pix.width height = pix.height # pixmap轉(zhuǎn)換為nympy.ndarray,供CnOcr識別 image = np.frombuffer(pix.samples, dtype=np.uint8).reshape(height, width, pix.n) res = ocr.ocr(image) string_list = [] for val in res: # 注意這是2.2版本以后的cnocr讀取識別結果的方式與2.1版本已經(jīng)不同 # 如果cnocr識別結果總是一些textscoreposition字符串,那就是用了老版的方式 string_list.append(val['text']) ocr_result_string = '\n'.join(string_list) f.write(ocr_result_string) # 這行代碼自帶文件關閉功能,不需要再寫 f.close() print(f'page{i + 1} finished.') pdf.close() input_file = f'test.pdf' output_file = 'test.txt' pdf2txt(input_file, output_file, 500, 522)
需要注意的是,在讀取cnocr的識別結果時,如果安裝的cnocr版本低于2.2,那么
以上代碼中的
for val in res: string_list.append(val['text'])
要改成下面這樣:
for i in range(len(res)): for j in res[i]: string_list.append(j)
但是2.2版本以后的cnocr如果仍然用以上方式,那么取出的識別結果將是一串“textscoreposition”。
下面是以上程序識別曹植集校注中一頁的結果:
(本冥指隱蔽偏鮮之處。此言卡太后即使在獨處之時也很謹慎,在隱
游之處電依禮行。
5〔誠(juon))潔也?!菜])進獻?!踩┡?、羊、豬,指祭
品。此吉請凈地進獻祭品。(視)條配時主持條禮之人。
3〔宜享斯祜]應該享受知此之服。精:棋。宋本作“”?!裁?br />社〕即受桶。(肉特)鍋獎。(勉)月“免。即超免
四〔會街盡禮)條祀折特時湖盡禮數(shù)。篤)厚,指調(diào)情加重。
[密)痊愈。(終)指生命到終點。
等〔遺州)南植自指。(在收)指在優(yōu)傷久病之中。(部)指下太
后去世的內(nèi)信?!矕|藩)洛陽東面的藩國。曹植時時東阿王。東阿在洛
陽東。[郊甸)郊野。丁本:《藝文類聚》作“晗。”家本亦作“除”。
哈指田地里的小路、與籌義同。(中原)原野之中。
中(皇址]望號。[遷)肉去。[峽復) 經(jīng)常來看我。
等〔歲字)空貌,即人去限空。(巡省階除)在宮中的小道上巡視。
(仿佛碳軒在窗戶間仿佛著見了下太行的身影容艦。銀軒:窗戶。
就【韓梨)指下太后的居室。(兒益)兒席。座席?!残Ч剩└淖?br />原承的樣子。
2〔酷指您傷全做。斯)如此。(墻)。(魏部)指鄴。曹操
界于都,下太后的是權專運到部與曹操合養(yǎng)。(日包)指鄴?!菜恚?amp;
道?!财?《藝文類聚》、宋本俱作“將”。
3(嘆息露興)嘆息之氣粥如霧氣興起,形容送師人之多?!卜?br />(r而))靈車。
容車飾駕,以合北展®
0丁本:“《文選》顏廷年《宋元泉后哀策文》李注引《上宜后請
&》.
-469.
原始掃描頁面100%縮放圖像如下:
可見準確率也還勉強可以接受。如果將圖像做個對比度增強并適當放大再識別,還可以進一步提高準確率。下面是使用OpenCV將圖片放大2倍后的識別結果,對比可以看出準確率有所提高:
(本冥〕指隱蔽偏解之處。此言卡太后即使在獨處之時也很謹慎,在隱
游之處也依禮間行。
S(磚(juon))潔也?!菜]〕進獻。(三牲〕牛、羊、豬.指祭
品。此言潔凈地進獻祭品。(?!臣漓霑r主持祭禮之人。
3(宜享斯祜)應該享受知此之福。精:攝、宋本作“豬”?!裁?br />社〕即受福?!矁淳?禍火?!裁悖┰?ldquo;免”.即避免。
四〔云傳盡禮)條祀祈傳時湖盡禮數(shù)。篤)厚,指病情加重。
(瘡)經(jīng)。〔終)指生命到終點。
多〔逸弧)曹植自指。(在款)指在優(yōu)傷久病之中。(諱)指下太
后去世的內(nèi)信?!矕|洛)洛陽東面的等國。、曹植時村東阿王。東阿在洛
陽東。(郊甸)郊野。丁本:《藝文類聚》作“峰。”宋本亦作“時”。
哈指田地里的小路。與年義同。(中原)原野之中。
9(皇址)皇號。[遷〕肉去。[峽復〕經(jīng)常來看我。
0〔歲凱)空貌,即人去屋空?!惭彩‰A涂)在宮中的小道上巡視。
(仿佛候軒)在窗戶間仿佛看見了卡太后的身影容顏。領軒:窗戶。
就〔韓蟹)指下太后的店室。〔兒流)兒席。座席?!矤C故)改變
原來的樣子。
心〔酷)指悲傷至極?!菜?如此。(秦)到?!参憾?指鄴。曹操
養(yǎng)于郎,下太后的是框要運到第與曹操合養(yǎng)。(舊色)指鄴。(能)眾
道?!财?《藝文類聚》、宋木供作“將”。
3(嘆息露興)嘆息之氣宛如霧氣興起,形容送葬人之多?!卜?br />(r而))靈車。
容車飾駕,以合北辰®
0丁本:“《文選》顏廷年《宋元皇后哀策文》李注引《上宣后請
表.”
.469.
以上就是Python利用cnocr庫實現(xiàn)pdf文件的文字識別的詳細內(nèi)容,更多關于Python cnocr pdf文字識別的資料請關注腳本之家其它相關文章!
相關文章
python中的decimal類型轉(zhuǎn)換實例詳解
decimal 模塊實現(xiàn)了定點和浮點算術運算符,使用的是大多數(shù)人所熟悉的模型,而不是程序員熟悉的模型,即大多數(shù)計算機硬件實現(xiàn)的 IEEE 浮點數(shù)運算。這篇文章主要介紹了python里的decimal類型轉(zhuǎn)換,需要的朋友可以參考下2019-06-06windows10下python3.5 pip3安裝圖文教程
這篇文章主要為大家詳細介紹了windows10下python3.5 pip3安裝圖文教程,注意區(qū)分python 2.x和python 3.x的相關命令,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題
今天小編就為大家分享一篇解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07人臉識別實戰(zhàn)之Opencv+SVM實現(xiàn)人臉識別
這篇文章主要介紹了通過Opencv+SVM實現(xiàn)人臉識別功能,文中的示例代碼介紹詳細,對于我們學習人臉識別和OpenCV都有一定的幫助,感興趣的小伙伴可以學習一下2021-12-12