今天我们来说一下,如何使用python识别PDF中的文字。今天,我们用
Python3, pillow, wand
和三个python包,分别是Tesseract下的:
textract,pytesseract
和
pyocr
。
下面的内容,同样也适用于普通文本,但是这货识别结果不是百分百准确,所以后期不要忘记仔细检查它。
更高层次的识别或者说是更人性化的代码实现,我们放在下一期文章,这篇文章我们先来简单的进阶,并且我们会对比一下这几个识别模块的效率怎么样。
开始识别之前,我们可以准备一份PDF文档,然后转换为图片格式。
主要是除了textract之外,都不能使用pdf格式,所以我们应该将pdf文件转换为图像(jpg)。我们将使用wand这个类库。
from wand.image import Image as Img
with Img(filename='file_name.pdf', resolution=300) as img:
img.compression_quality = 99
img.save(filename='image_name.jpg')
现在我们可以使用包装器将新图像放到OCR中,然后使用regexp或其他任何文本工具(例如NLTK)查找所需的数字。但是这种方式有点白搭...
比较好的方法是你可以用一些绘图工具比如PS剪裁一下。
然后我们裁剪大图,然后提取里面的小图:
from PIL import Image
img = Image.open('image_name.jpg')
crop_img = img.crop((x1, y1, x2, y2))
crop_img.save('amount.jpg')
返回结果:
好的,现在我们可以开始识别我们的图像了。别忘了,只有textract可以打开图像,另一个需要使用pillow.
测试效果:
用textract识别:
import textract
text = textract.process('image.jpg', encoding='ascii', method='tesseract')
返回结果:
{'3rd Image': b'0.130\n\n',
'1st Image': b'4.433\n\n',
'4th Image': b'1M0\n\n',
'5th Image': b'DJUG\n\n',
'2nd Image': b''}
用pytesseract识别:
from PIL import Imageimport pytesseract
text = pytesseract.image_to_string(Image.open('image.jpg'))
返回结果:
{'5th Image': '0.00',
'3rd Image': '0.00',
'1st Image': '4.03',
'4th Image': '1W',
'2nd Image': ''}
用pytesseract识别:
import pyocrimport pyocr.buildersfrom PIL import Image
tools = pyocr.get_available_tools()[0]
text = tools.image_to_string(Image.open(image), builder=pyocr.builders.DigitBuilder())
返回结果:
{'4th Image': '1 300',
'1st Image': '4.03',
'2nd Image': '',
'3rd Image': '0.00',
'5th Image': '0.00'}
额...看起来效果不是很好,或者说有些残酷。识别率太低,为什么呢?会不会问题出在我们的图片上呢?
还真是,如果你们要从pdf文件中缩放提取的图像,你们会在图像中看到很多噪点。要解决这个问题,我们可以尝试将图像转换为单色模式(灰度):
from PIL import Image
img = Image.open('image.jpg')img = img.convert('L')img.save('image.jpg')
然后….
看吧这个看起来好多了,我们重新运行来测试。
返回结果:
{'3rd Image': b'0.00\n\n',
'5th Image': b'0.00\n\n',
'4th Image': b'1000\n\n',
'1st Image': b'4.03\n\n',
'2nd Image': b''}
Pytesseract:
{'1st Image': '4.03',
'4th Image': '1000',
'5th Image': '0.00',
'2nd Image': '',
'3rd Image': '0.00'}
Pyocr:
{'5th Image': '0.00',
'3rd Image': '0.00',
'2nd Image': '',
'4th Image': '1000',
'1st Image': '4.03'}
所以,在这种情况下,除第二张图像外,所有的模块返回的数据都很准确。
总结:
Textract:
Textract是一个很有前途的类库。它可以从pdf,gif,docx,png,jpg等中提取数据。但是这个包只能用于简单的pdf文件(没有表格,很多列等),而且这个包比较大(大约30mb左右)
Pytesseract:
中规中矩的识别库,但没什么特别的。
Pyocr:
很好用,具有更多功能的python包,比如你可以设置要识别的数据(句子,单词,数字等),可以使用Tesseract或Cuneiform,进行方向检测等等。