OCR识别图片和PDF上的文字

识别pdf上的文字分几步进行:

1、引入wand模块,把pdf文件转成图片序列,通过序列的索引可以获得pdf的每一页。

2、遍历这个图片序列,把序列的每一页变成wand图片对象,转成灰度模式(简单预处理下,以提高识别度),接下来本应添加进图像列表req_image中,但却遇到一个问题:

PyOCR模块做图片文字识别的功能函数的形参只接收pillow的Image模块打开的图片PIL.Image.open(),不接受wand图形对象,PIL.Image.open()也不接收wand图片对象。当然可以wand图像对象保存成图片文件,然后PIL.Image.open()打开这个图片文件。

有个更快的处理方法,不用硬盘(硬盘慢)做媒介用缓存(buffer):先用wand图片对象的make_blob把图片转成二进制数据流,把二进制数据流放入列表req_image中。

3、遍历列表req_image,ByteIO()读取二进制数据流,返回值可以被PIL.Image.open()接受。接下去就可以调用PyOCR模块的功能函数做图片文字转换了。

4、将识别结果放进列表final_text,用pprint模块的pprint()显示出来。pprint,pretty print顾名思义,输出结果规整好看一些。

from wand.image import Image as wandImage	# pdf –> jpeg
from PIL import Image as pillowIMage	# PyOCR需要
import pyocr.builders		# OCR识别
import io				# 将Wand处理结果传给给Pillow
import pprint			# 美美的打印出来

# PyOCR初始化
tool = pyocr.get_available_tools()[0]	
# 获得OCR内核工具,这里用的是Tesseract
lang = tool.get_available_languages()[0]
# 获得识别用语言,这里用的是简体中文,参见20.2 PyOCR的初始化程序

req_image = []	# 存放pdf转换过来的图片二进制数据流
final_text = []	# 存放识别结果,每个元素是每一页识别出来的文字

ima_pdf = wandImage(filename='instance.pdf', resolution=300)
# 打开pdf文件,生成wand图片对象。分辨率设为300,设高分辨率有助于提高识别率
image_jpeg = ima_pdf.convert('jpeg')	
# pdf文件转成图片,实际上是个图片序列,序列的长度与pdf的页数相同

for img in image_jpeg.sequence:	# 遍历图片序列的每页图片
    img_page = wandImage(image=img)	# 生成为wand图片对象
    img_page.type = 'grayscale'		# 转成灰度模式有助于OCR识别文字
req_image.append(img_page.make_blob('jpeg'))	
# 转成二进制数据流放进列表

for img in req_image:		# 一页一页OCR识别文字
    text = tool.image_to_string(
        pillowIMage.open(io.BytesIO(img)),
	# io.BytesIO()从内存中读入二进制数据流
        lang=lang,	# 识别语言
        builder=pyocr.builders.TextBuilder()	# 识别器
    )
    final_text.append(text)		# 识别出来的结果添进列表

pprint.pprint(final_text)	# 显示识别结果