使用python擷取pdf上的文字(in win10)__python

來源:互聯網
上載者:User

環境版本: 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.