使用PyMuPdf提取、删除及替换PDF中的图片文件

有时候想把PDF中的图片文件提取出来,身为程序员的我当然是自己写段代码来实现,先看看了网上的方法,都是逐行遍历,正则匹配来提取什么的,其实没有那么复杂,PyMuPdf官方文档里自带就有提取图片文件的方法,非常简单,下来用代码来记录下:

1.提取图片

#coding:utf-8
import fitz,os
doc = fitz.open('E:\\files\\25109878.pdf')
imgcount=0
for page in doc:
    imageList = page.getImageList()
    print(imageList)
    for imginfo in imageList:
        pix = fitz.Pixmap(doc, imginfo[0])
        pix.writePNG(os.path.join("test\\t_{}.png".format(imgcount)))
        imgcount+=1

短短几行代码聊表心意,通过page.getImageList()提取到图片列表信息,然后在使用fitz.Pixmap提取对应的图片内容,就是这么简单,我们来提取下一张发票里的图片:

电子发票里基本都是文字形式的,只有二维码和下方印章的图片,执行上面的代码看看:

2.删除PDF中的图片部分

在官方文档里我没看到,但是在它的库文件有这个方法:

这个xref对应的应该是图片所在位置的行数

#coding:utf-8
import fitz,os
doc = fitz.open('E:\\files\\25109878.pdf')
imgcount=0
for page in doc:
    imageList = page.getImageList()
    print(imageList)
    for imginfo in imageList:
        #删除图片
        doc._deleteObject(imginfo[0])
#重新保存PDF
doc.save('111.pdf')

我们来执行看下:

很明显图片部分已经删除掉了!

3、替换图片

关于这块由于时间原因没有过多的去研究,这里面有个问题就是,怎么让自己的图片按照PDF中显示的位置及大小进行替换,稍微看下了官方文档,里面只有个insertImage这个方法是插入图片,但是其中有个rect的参数(top,left,wight,height),这几个参数我没太搞明白怎么获取到原始图片的位置及大小,因为有可能图片是缩放过的,于是看了下insertImage的源代码,发现有个_imgname的属性。

原本的方法是在原来的图片后面追加一张图片:

但是这里就有我提出来的问题怎么获取到原始图片的位置及宽高,目前我还没有找到这个方法,但发现了一个勉为其难的方法,我将红色部分注释掉,然后这样写:

#coding:utf-8
import fitz,os
doc = fitz.open('E:\\files\\25109878.pdf')
imgcount=0
for page in doc:
    imageList = page.getImageList()
    for imginfo in imageList:
        rect = fitz.Rect(0, 0, 80, 80)
        page.insertImage(rect, filename="test.png", _imgname=imginfo[7])
doc.save('111.pdf')

这里的insertImage加入图片的方式有3种,这里我们直接通过文件名加载,imginfo[7]就是原始图片的name,我直接插入到原始图片的位置,我们来执行看看:

这样貌似是实现了图片的替换,但上面多了一块fitz.Rect(0, 0, 80, 80)这个区域,查了下文档貌似没找到好的办法处理,那我就将它设置为fitz.Rect(0, 0, 0.1, 0.1),我们来看看:

这样就勉强实现了替换的效果,其实主要关键就是怎么获取到原始图片的坐标及宽高,如果能解决这个问题,那就不需要这么麻烦的操作,由于时间原因,我也没有过多的去深入研究了,如果有知道的小伙伴记得@我^_^

以上就是利用PyMuPdf提取、删除及替换PDF中的图片文件

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

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值