某天有个需求:多张二维码图片合并到一个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))
效果:
每个二维码都占据了一页,未找到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()
效果:
搞定!
备注: python==3.7 img2pdf==0.4.4 reportlab==3.6.12