江湖小白之进阶篇 (四)使用PyMuPdf库来实现图片PDF文件的提取

     人上了年纪就容易回忆过去,淡淡的忧愁……这里不禁吐槽,谁说的摆地摊没城管管的,你出来,我保证不打死你!玩了一晚上搬家游戏,哎,还是老老实实回来敲代码吧。

    本来这篇我们要接着将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)

这样就不要将图片保存下来后再去处理,节约了时间和资源,我们运行看看:

嗯,我感觉行~~!

好了,这篇的内容就到这里结束了,嗯,感觉好困,去睡个觉!

什么是江湖?烦恼不断,为生活奔波!江湖不说再见,咱们下篇见!

关注公众号,超越平凡才能成就自我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章