多张图片转为pdf格式

446 阅读1分钟

某天有个需求:多张二维码图片合并到一个pdf里,按需排版(一行n张图片)。

一番搜索之后,首先使用 image2pdf 代码:
import img2pdf
def img_pdf(photo_path):
    photo_list = os.listdir(photo_path)
    photo_list = [os.path.join(photo_path, i) for i in photo_list]

    # 指定pdf的单页的宽和高
    # A4纸张
    a4inpt = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297))
    imgsize = ((img2pdf.ImgSize.dpi, 200), (img2pdf.ImgSize.dpi, 200))

    layout_fun = img2pdf.get_layout_fun(a4inpt, imgsize)

    with open(photo_path + '\1result.pdf', 'wb') as f:
        f.write(img2pdf.convert(photo_list, layout_fun=layout_fun))

效果:

image.png

每个二维码都占据了一页,未找到image2pdf怎么对图片进行排版

使用 reportlab 代码:

from PIL import Image
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

def img_pdf(photo_path):

    # 设置PDF页面大小
    page_size = A4
    gutter = 20  # 间隔
    columns = 4
    item_width = (page_size[0] - (gutter*(columns+1))) / columns
    item_height = item_width

    # 读取图片列表
    photo_list = os.listdir(photo_path)
    photo_list = [os.path.join(photo_path, i) for i in photo_list]
    images = [Image.open(image) for image in photo_list]

    # 创建PDF canvas 并添加图像
    pdf_path = os.path.join(photo_path, "output.pdf")
    pdf = canvas.Canvas(pdf_path, pagesize=page_size)
    x = gutter
    y = page_size[1] - gutter - item_height
    count = 0
    row = 0
    for img in images:
        if count % columns == 0 and count != 0:
            row += 1
            x = gutter
            y = page_size[1] - (gutter + item_height) * (row + 1)
            
            # 超出页面,新建一页
            if (gutter + item_height) * (row + 1) > page_size[1]:
                row = 0  # 重置行数
                pdf.showPage()
                y = page_size[1] - gutter - item_height
        pdf.drawImage(img.filename, x, y, item_width, item_height)
        x += item_width + gutter
        count += 1
    pdf.save()

效果:

image.png

搞定!

备注: python==3.7 img2pdf==0.4.4 reportlab==3.6.12