PDF转图片再转长图、python、pil

PDF转图片再转长图、python、pil

直接贴代码

# -*- coding: utf-8 -*-
"""
1、安装库
    pip install pymupdf
    pip install pillow
2、修改main方法参数
3、运行
"""
import os
import sys

import fitz
from PIL import Image


def pdf_to_images(pdf_path, img_path):
    #  打开PDF文件,生成一个对象
    doc = fitz.open(pdf_path)
    for pg in range(doc.pageCount):
        page = doc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
        zoom_x = 2.0
        zoom_y = 2.0
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pm = page.getPixmap(matrix=trans, alpha=False)
        try:
            os.mkdir(img_path)
        except FileExistsError:
            pass
        pm.writePNG(f'{img_path}/%s.png' % pg)


def join(png1, png2, size):
    img1, img2 = Image.open(png1), Image.open(png2)
    size1, size2 = img1.size, img2.size  # 获取两张图片的大小
    joint = Image.new('RGB', (size1[0], size1[1] + size2[1] - size))
    # 新建一张新的图片
    # 因为拼接的图片的宽都是一样,所以宽为固定值
    # 高为两张图片的高相加再减去需要缩进的部分
    loc1, loc2 = (0, 0), (0, size1[1] - size)
    # 两张图片的位置
    # a-------------
    # |            |
    # |            |
    # |            |
    # |            |
    # |            |
    # b------------|
    # |            |
    # |            |
    # |            |
    # |            |
    # |------------|

    # 位置都是以该图片的左上角的坐标决定
    # 第一张图片的左上角为a点,a的坐标为(0,0)
    # 第二张图片的左上角为b点,a的横坐标为0,纵坐标为第一张图片的纵坐标减去第二张图片上移的size: (0, size[1]-size)

    joint.paste(img2, loc2)
    joint.paste(img1, loc1)
    # 因为需要让第一张图片放置在图层的最上面,所以让第一张图片最后最后附着上图片上
    joint.save(result)


def start(items, size, first_path=None):
    # 当first为None时,默认将第一张图片设置为图片列表的第一张图片,第二张图片设置为图片列表的第二张
    # 当这两张图片合成后,将图片列表的已经合成的图片元素移除
    # 然后将合成的图片设置为第一张图片,将剩余的没有合成的图片列表继续操作
    # 当first_path不为None,将第一张图片设置为first_path,第二张图片设置为传进来的列表的第一个元素
    # 合成之后,将刚刚使用的列表的元素删除
    # 最后递归函数,知道列表为空
    try:
        if not first_path:
            path1, path2 = items[0], items[1]
            join(path1, path2, size)
            items.remove(path1)
            items.remove(path2)
            return start(items, size, first_path=result)
        else:
            path2 = items[0]
            join(first_path, path2, size)
            items.remove(path2)
            return start(items, size, first_path=result)
    except:
        pass


def getAllImg(path):
    result = []
    filelist = os.listdir(path)
    i = 0
    for file in filelist:
        if str(file).split(".")[0].isdigit():
            result.append(os.path.join(path, f"{str(i)}.png"))
        i += 1
    return result


if __name__ == '__main__':
    # 图片保存路径:
    path = "image"
    pdf_to_images("尽早暴露问题&写文档也是一种学习方式.pdf", path)
    result = f"{path}/result.png"
    s = getAllImg(path)
    start(s, 100)
    print('最后图片尺寸--->', Image.open(result).size)

运行环境

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值