環境版本: WIN10 | Python 3.6 | ImageMagick-6.9.9-38-Q8-x64-dll | Ghostscript 9.22 for Windows
整體思路:1.將PDF轉為圖片後進行文字識別 | 2.使用pdfminer解析pdf檔案(準確率更高)
目錄
1.下載安裝tesseract 2.安裝pyocr、Wand、Pillow 3.下載安裝ImageMagick、Ghostscript 4.配置TESSDATA_PREFIX環境變數 5.修改pyocr包裡的tesseract.py檔案 6.編寫並運行程式 產生的圖片 運行結果 7.遇到的問題及解決方案 ①運行程式時報錯OSError: cannot find library; tried paths: ②DelegateError: PDFDelegateFailed `一堆亂碼(請跳過) ③DelegateError: PDFDelegateFailed `系統找不到指定的檔案。 ④No OCR tool found或pytesseract.TesseractError: 8.使用pdfminer解析pdf檔案(準確率更高) ①安裝pdfminer3k ②編寫並運行程式
1.下載安裝tesseract
在 github.com/UB-Mannheim/tesseract/wiki下載tesseract-xxx.exe檔案後安裝即可。需要注意的是,在選擇安裝組件時點開“Language data” 選上你要識別的語言,不選的話只能識別英文喲。 2.安裝pyocr、Wand、Pillow
pip install pyocrpip install Wandpip install Pillow
若python版本為2.x需在http://pythonware.com/products/pil/下載Python Imaging Library (PIL) exe檔案安裝。 3.下載安裝ImageMagick、Ghostscript
Wand依賴ImageMagick,ImageMagick依賴Ghostscript,去下面連結下載安裝即可。
ImageMagick:http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows
注意不要下載 ImageMagick 7.x版本,wand不支援。
Ghostscript :https://ghostscript.com/download/gsdnld.html 4.配置TESSDATA_PREFIX環境變數
變數值為tesseract安裝目錄,改完後重啟一下項目。 5.修改pyocr包裡的tesseract.py檔案
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY#TESSERACT_CMD = 'tesseract.exe' if os.name == 'nt' else 'tesseract'#TESSERACT_CMD = 'D:/Program Files (x86)/Tesseract-OCR/tesseract.exe' if os.name == 'nt' else 'tesseract'TESSERACT_CMD = os.environ["TESSDATA_PREFIX"] + '/tesseract.exe' if os.name == 'nt' else 'tesseract'
6.編寫並運行程式
前面的準備工作完成後,讓我們來運行程式吧。
# -*- coding: utf-8 -*- py3不需要from wand.image import Imagefrom PIL import Image as PIimport pyocrimport pyocr.buildersimport ioimport sysdef main(): tools = pyocr.get_available_tools() if len(tools) == 0: print("No OCR tool found") sys.exit(1) tool = tools[0] print("Will use tool '%s'" % (tool.get_name())) langs = tool.get_available_languages() print("Available languages: %s" % ", ".join(langs)) lang = langs[0] print("Will use lang '%s'" % (lang)) req_image = [] final_text = [] image_pdf = Image(filename="./pdf_file/stackoverflow.pdf", resolution=400) image_jpeg = image_pdf.convert('jpeg') image_jpeg.save(filename='./pdf2img/stackoverflow.jpeg') for img in image_jpeg.sequence: img_page = Image(image=img) req_image.append(img_page.make_blob('jpeg')) for img in req_image: txt = tool.image_to_string( PI.open(io.BytesIO(img)), lang=lang, builder=pyocr.builders.TextBuilder() ) final_text.append(txt) print(final_text) # for text in final_text: # print(text)if __name__ == '__main__': main()
產生的圖片
運行結果
7.遇到的問題及解決方案 ①運行程式時報錯OSError: cannot find library; tried paths:
‘D:\Program Files\ImageMagick-7.0.7-Q16\CORE_RL_wand_.dll’,
‘D:\Program Files\ImageMagick-7.0.7-Q16\libMagickWand.dll’,
…
又去官網看了一下發現這段話:
Wand yet doesn’t support ImageMagick 7 which has several incompatible APIs with previous versions. For more details, see the issue #287.
卸載了之後重新安裝ImageMagick-6.9.9-38-Q8-x64-dll版本問題解決。 ②DelegateError: PDFDelegateFailed `一堆亂碼(請跳過)
查了半天看到一哥們也用python3.6遇到這問題,但沒有解決辦法,心想切換成python2.7試試。如非需要切換python版本請看一條。
(在Anaconda3中實現多版本python Spyder共存)
全程在anaconda cmd中操作
1)先在conda中建立一個名為python2的環境,並下載對應版本python2.7
conda create –name python2 python=2.7
2)啟用python2環境
activate python2
3)在python2的環境下下載spyder和Jupter notebook
conda install spyder
#conda install jupyter ③DelegateError: PDFDelegateFailed `系統找不到指定的檔案。
’ @ error/pdf.c/ReadPDFImage/
之前是在pycharm中啟動並執行,切換成python2.7後先在spyder試了一下,結果之前的亂碼變成中文了。查了一下發現是因為沒有安裝ghostscript,安裝之後問題解決。然後我又切換為python3.6,也不報錯了。
Ghostscript :https://ghostscript.com/download/gsdnld.html ④No OCR tool found或pytesseract.TesseractError:
(1, ‘Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/chi_sim.traineddata’)
安裝Tesseract後需設定環境變數 TESSDATA_PREFIX並修改tesseract.py檔案
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY#TESSERACT_CMD = 'tesseract.exe' if os.name == 'nt' else 'tesseract'#TESSERACT_CMD = 'D:/Program Files (x86)/Tesseract-OCR/tesseract.exe' if os.name == 'nt' else 'tesseract'TESSERACT_CMD = os.environ["TESSDATA_PREFIX"] + '/tesseract.exe' if os.name == 'nt' else 'tesseract'
D:\Program Files (x86)\Tesseract-OCR (供參考,以實際安裝路徑為準)
如果不設定環境變數,在安裝盤之外的路徑運行tesseract時會提示:
Please make sure the TESSDATA_PREFIX environment variable is set to the parent d irectory of your “tessdata” directory
注意設定環境變數後需重啟項目 8.使用pdfminer解析pdf檔案(準確率更高)
詳見:
http://blog.csdn.net/u011389474/article/details/60139786
https://www.cnblogs.com/jamespei/p/5339769.html ①安裝pdfminer3k
pip install pdfminer3k
②編寫並運行程式
from pdfminer.pdfparser import PDFParser, PDFDocumentfrom pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreterfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import LTTextBoxHorizontal, LAParamsfrom pdfminer.pdfinterp import PDFTextExtractionNotAllowed''' 解析pdf 文本,儲存到txt檔案中'''path = r'./pdf_file/stackoverflow.pdf'def parse(): fp = open(path, 'rb') # 以二進位讀模式開啟 # 用檔案對象來建立一個pdf文件剖析器 praser = PDFParser(fp) # 建立一個PDF文檔 doc = PDFDocument() # 串連分析器 與文檔對象 praser.set_document(doc) doc.set_parser(praser) # 提供初始化密碼 # 如果沒有密碼 就建立一個空的字串 doc.initialize() # 檢測文檔是否提供txt轉換,不提供就忽略 if not doc.is_extractable: raise PDFTextExtractionNotAllowed else: # 建立PDf 資源管理員 來管理共用資源 rsrcmgr = PDFResourceManager() # 建立一個PDF裝置對象 laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 建立一個PDF解譯器對象 interpreter = PDFPageInterpreter(rsrcmgr, device) # 迴圈遍曆列表,每次處理一個page的內容 for page in doc.get_pages(): # doc.get_pages() 擷取page列表 interpreter.process_page(page) # 接受該頁面的LTPage對象 layout = device.get_result() """ 這裡layout是一個LTPage對象 裡面存放著 這個page解析出的各種對象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要擷取文本就獲得對象的text屬性 """ for x in layout: if isinstance(x, LTTextBoxHorizontal): with open(r'./pdf_file/stackoverflow.txt', 'a') as f: results = x.get_text() print(results) f.write(results + '\n')if __name__ == '__main__': parse()
參考連結:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000https://www.cnblogs.com/zhiyong-ITNote/p/6852113.htmlhttp://blog.csdn.net/HuangZhang_123/article/details/61920975https://www.cnblogs.com/wzben/p/5930538.htmlhttps://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pythonhttp://blog.topspeedsnail.com/archives/3571https://www.cnblogs.com/yourstars/p/5849881.htmlhttps://segmentfault.com/q/1010000007964197