Python 利用pymupdf将pdf转换为图片并拆分,后通过PIL合并生成一张图片

文章主要内容主要参考几篇文章并合并在一起的,文章链接依次如下,第二和第三的文章链接是从第一篇文章找到的:

(1)、https://blog.csdn.net/qq_25115281/article/details/90766814

(2)、https://blog.csdn.net/qq_43145035/article/details/83270501

(3)、https://blog.csdn.net/levy_96/article/details/83379373#commentsedit

这里只给出相关简单的代码,实际项目应用还需大家自己结合

1、首先,第一步,安装pymupdf模块,使用下面的命令安装:

pip install pymupdf

2、第二步,安装成功后,开始写我们的代码,这里改了一下第一篇参考文章的代码,主要实现将一个pdf转换为图片的代码,其中改了一点代码,增加了异常处理,返回值为布尔类型,True和False:

import fitz
import os

def convert_img(file_path):
    try:
        #  打开PDF文件,生成一个对象
        doc = fitz.open(file_path)
        img_path = r'F:\pro\study\imgs'  # 这里的文件路径看你自己的项目路径,
        # 我的项目是F:\pro\study 这个是我的项目路径,后边是要创建的文件夹路径
        # 判断路径文件夹是否存在,如果不存在我们就创建一个 好吧
        if not os.path.exists(img_path):
            os.mkdir(img_path)
        # 这里就是参考的上边连接的方法了,你们看人家的代码很容易明白
        for pg in range(doc.pageCount):
            page = doc[pg]
            rotate = int(0)
            # 每个尺寸的缩放系数为1.5,这将为我们生成分辨率提高三倍多的图像。如果转换出来图片是横排的话(即方向改变的话),请把下面的数值改小点
            zoom_x = 1.5
            zoom_y = 1.5
            trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
            pm = page.getPixmap(matrix=trans, alpha=False)
            # pm.writePNG('%s.png' % pg)
            # 这里因为我要写入我上边创建的文件加下,所以我要进行路径的拼接,
            # 注意不要直接在这里去改img_path,否则他会在原有path基础上向后追加新的字段,产生新的路径,一定要重新写的新的变量存储路径
            temppic_path = os.path.join(img_path, ('img'+str(pg) + '.png'))
            print(temppic_path)
            pm.writePNG(temppic_path)
            print('done@@@')
        # 这里是因为我后边需要在最后一页加盖章,所以我要返回个关于页数的图片索引,去进行图片的寻找
        # 这里减1是因为 pageCount 得到的是从1 开始的pdf页数,而我后边要索引的时候是从0 进行查查找的,所以先在这里 -1
        # print(str(doc.pageCount - 1))
        # return str(doc.pageCount - 1)
        return True
    except Exception as e:
        return False

3、第三步,接下来安装PIL相关的库,使用命令,如果安装失败,可能缺少什么依赖,网上资料很多,请自行查阅:

pip install Pillow

4、第四步,通过PIL合并生成一张图片,主要参考用了第二篇文章的一部分代码,我直接搬过来了,改了下合成后图片的保存路径,保存为项目底下imgs目录下的img.png,跟pdf拆分出来的图片放在同一个目录,代码如下:

def _merge_img(img_list):
    """拼接图片"""
    if img_list:
        img_name = img_list[0]
        color_mod = 'RGBA' if img_name.endswith('.png') else 'RGB'  # jpeg格式不支持RGBA
        first_img = PIL_Image.open(img_list[0])
        height_size = first_img.size[1]
        total_width = first_img.size[0]
        total_height = height_size * len(img_list)
        left = 0
        right = height_size
        target = PIL_Image.new(color_mod, (total_width, total_height))  # 最终拼接的图像的大小
        for img in img_list:
            target.paste(PIL_Image.open(img), (0, left, total_width, right))
            left += height_size
            right += height_size
        target.save('F:\\pro\\study\\imgs\\img.png', quality=100)
        return img_name
    else:
        return ''

5、第五步,测试代码,上面的代码都是写在同一个py文件底下,因此我们可以用下面的代码调试,即用的main方法:

if __name__ == '__main__':
    # 拆分pdf,生成多张图片
    convert_flag = convert_img('F:\pro\study\test.pdf')
    # 拆分成功,将多张图片追加进列表,并合并为一张图片
    if convert_flag:
        img_list = []
        img_list.append(r'F:\pro\study\imgs\img0.png')
        img_list.append(r'F:\pro\study\imgs\img1.png')
        img_list.append(r'F:\pro\study\imgs\img2.png')
        _merge_img(img_list)

6、此时可以看下F:\pro\study\imgs目录底下是否将test.pdf文件拆分为img0.png、img1.png、img2.png三张图片,并合成一张新的图片img.png:

7、以上内容仅供学习参考,谢谢!

猜你喜欢

转载自blog.csdn.net/u012561176/article/details/106666044