人上了年纪就容易回忆过去,淡淡的忧愁……这里不禁吐槽,谁说的摆地摊没城管管的,你出来,我保证不打死你!玩了一晚上搬家游戏,哎,还是老老实实回来敲代码吧。
本来这篇我们要接着将Sanic框架的websocket服务的,但是为了防止枯燥无味,我们先来实现一下对PDF文件的提取,一般PDF里基本都是图片形式的,我们就选择PyMuPdf库来实现,首先来安装一下要使用的库PyMuPdf和opencv:
#安装PyMuPdf
pip install PyMuPdf
#安装opencv图像处理库
pip install opencv-python
这里为什么使用opencv呢,这里有我自己的原因,我以后想把提取出来的图片进入文字识别,opencv能方便的把图片处理成识别需要的数据格式,你也可以用PIL来处理图片。
来,接着继续,小二上代码:
#coding:utf-8
import fitz,cv2,uuid
import numpy as np
class Pdf():
def __int__(self):
pass
def pdf2pic(self,filename):
try:
#加载读取pdf文件
doc = fitz.open(filename)
#循环提取pdf页面
for i in range(doc.pageCount):
# 获取当前页内容
page = doc[pageCount]
# 缩放及旋转
zoom = 3
rotate = 0
trans = fitz.Matrix(zoom, zoom).preRotate(rotate)
pm = page.getPixmap(matrix=trans, alpha=False)
# 这里获取到数据流,看了下源码,下面可以直接用getPNGdata()
getpngdata = pm.getImageData(output="png")
# 解码为 np.uint8
image_array = np.frombuffer(getpngdata, dtype=np.uint8)
img_cv = cv2.imdecode(image_array, cv2.IMREAD_ANYCOLOR)
# 保存为图片测试看看
filename='{}_{}.png'.format(pageCount,uuid.uuid4())
cv2.imwrite('app\\files\\{}'.format(filename), img_cv)
except Exception as e:
print(e)
return filename
if __name__=='__main__':
path='app\\files\\test.pdf'
p=Pdf()
p.pdf2pic(path)
这里我创建了一个类文件来实现提取的方法,看上面的代码其实很简单,这里我不太多的讲了,但有几个地方我要重点说下,在实际开发中肯定会用到:
1.其中的getImageData方法,这是获取数据流的格式,有什么用?比如你针对PDF文件提取后做图像识别,在过程中不想将图片保存后再去识别,那这里就是关键了,我们在结合cv2直接将提取的数据流转换成识别需要的数据格式,提高执行的效率及资源的占用.
2.fitz.open(filename)这里是打开pdf本地文件,实现在线pdf文件的处理,我们一般的处理过程是上传文件,将文件保存后在调用这个文件执行,但是这种方式太low了,对我们这些立志成为大牛的级别的人来说是不屑的,那怎么直接转换数据呢,我们可以跟踪一下这个open的方法:
继续跟进:
看到没有,处理了加载文件路径,还可以直接使用文件流,那这就方便了,不需要我们将文件保存下来在执行了,使用方法就是:
#比如我从浏览器上传了pdf文件,我们用request接收了文件
file = request.files.get('file')
#直接传递文件流数据
doc = fitz.open('type',file.body)
这样就不要将图片保存下来后再去处理,节约了时间和资源,我们运行看看:
嗯,我感觉行~~!
好了,这篇的内容就到这里结束了,嗯,感觉好困,去睡个觉!
什么是江湖?烦恼不断,为生活奔波!江湖不说再见,咱们下篇见!
关注公众号,超越平凡才能成就自我