[Python]多个图片自动生成“骑马订”排版的小册子 PDF

用途

将一系列散装的图片(如1.webp、2.webp、3.webp……)处理成 “骑马订”打印格式的 PDF 文件。

核心功能

骑马订排版的核心逻辑:举个例子,对于8页小册子的第一张纸,正面:第8页和第1页,反面:第2页和第7页,而非简单的按顺序堆叠图片。

  • 主要功能:自动计算页码顺序,把零散的图片根据骑马订的逻辑拼接(根据图片名的数字作为索引),打印出来后只需对折装订,就能做成一本小册子。
  • 自动补齐页数:由于骑马订要求总页数必须是 4 的倍数,程序会自动添加空白页。
  • 画布拼接与装订缝:为了后续的装订方便,在中间画布拼接时加了一小段空白装订线。

食用示例

实现代码

注意
1.脚本使用 sorted(os.listdir),所以请确保你的图片命名是按顺序的(如 01.jpg, 02.jpg,中间可以跳数字,但必须有顺序),否则页码会乱序。
2.脚本会一次性将所有图片加载到内存中。如果处理几百张高清大图,可能会导致内存不足。
3.建议所有的图片尺寸一致。
pip install Pillow
import os
from PIL import Image
from math import ceil

# 装订缝宽度(像素)
gutter = 35
# 原图文件夹
folder = "images"

files = sorted(os.listdir(folder))

images = [Image.open(os.path.join(folder,f)).convert("RGB") for f in files]

n = len(images)
target = ceil(n/4)*4

blank = Image.new("RGB", images[0].size, "white")
while len(images) < target:
    images.append(blank)

pages = len(images)
sheets = pages // 4

order = []

for i in range(sheets):
    order += [
        pages - 2*i,
        1 + 2*i,
        2 + 2*i,
        pages - (2*i +1)
    ]

ordered = [images[i-1] for i in order]


pdf_pages = []

for i in range(0,len(ordered),2):

    w,h = ordered[i].size

    canvas = Image.new("RGB",(w*2+gutter,h),"white")

    canvas.paste(ordered[i],(0,0))
    canvas.paste(ordered[i+1],(w+gutter,0))

    pdf_pages.append(canvas)

pdf_pages[0].save(
    folder + ".pdf",
    save_all=True,
    append_images=pdf_pages[1:]
)

其实不用非得写代码的……

在Adobe Acrobat软件的打印选项卡中,可以设置「小册子」的打印模式,实现的效果和上面的程序差不多……啊哈哈

讨论区

评论

3 条
  1. Ksable的头像
    Ksable

    想起了之前敲了半天的代码,然后发现 github 上有现成的,纯当练习了吧

    1. Mimosa233的头像
      Mimosa233 作者

      太真实了,心态真好 :kashioda_7:

    2. Mimosa233的头像
      Mimosa233 作者

      太真实了,心态真好 :kashioda_7:

发表评论

目录

目录

系列文章
学习笔记/技术
License
许可协议:CC BY-SA 4.0
原文链接:https://loneapex.cn/archives/5306