You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调整PDF页码顺序适配小册子打印:解决非4倍数页数时遗漏最后页面的问题

Python调整PDF页码顺序适配小册子打印:解决非4倍数页数时遗漏最后页面的问题

嗨,你的思路其实已经很靠谱啦!确实如你所想,问题出在zip()身上——它会以最短的那个序列的长度为准,一旦有一个序列迭代完就立刻停止,所以当总页数没法被4整除时,最后剩下的几页就被无情漏掉了。

要解决这个问题,我们可以用itertools模块里的zip_longest来代替zip。这个函数会把所有序列的元素都遍历完,对于长度不足的序列,会用你指定的填充值(比如None)来补全,这样就能把所有页面都覆盖到了。

下面是改进后的代码,不仅能处理页数被4整除的情况,也能完美适配剩余1-3页的场景:

import pypdf
from itertools import zip_longest

# 用上下文管理器自动管理文件,避免手动关闭的麻烦
with pypdf.PdfReader('test.pdf') as pdf:
    writer = pypdf.PdfWriter()
    total_pages = len(pdf.pages)

    # 保持你原来的分组逻辑
    sq_1 = range(1, total_pages, 4)
    sq_2 = range(2, total_pages, 4)
    sq_3 = range(3, total_pages, 4)
    sq_4 = range(0, total_pages, 4)

    # 用zip_longest代替zip,填充值设为None
    for a, b, c, d in zip_longest(sq_1, sq_2, sq_3, sq_4, fillvalue=None):
        # 逐个判断页码是否有效,有效就添加到新PDF
        if a is not None and a < total_pages:
            writer.add_page(pdf.get_page(a))
        if b is not None and b < total_pages:
            writer.add_page(pdf.get_page(b))
        if c is not None and c < total_pages:
            writer.add_page(pdf.get_page(c))
        if d is not None and d < total_pages:
            writer.add_page(pdf.get_page(d))

    # 写入新文件
    with open("output.pdf", "wb") as output:
        writer.write(output)

改动说明:

  1. 替换zip为zip_longest:确保所有序列的元素都被遍历,哪怕某个序列已经耗尽,用None填充空缺的位置。
  2. 添加有效性判断:在添加页面之前,先检查当前页码是否有效(不是None且小于总页数),避免报错。
  3. 使用上下文管理器:用with语句自动处理文件的打开和关闭,比手动调用close()更安全规范。

举个例子,如果你的PDF有5页:

  • 第一组会处理页码索引1、2、3、0(对应原页码2、3、4、1)
  • 第二组会处理None、None、None、4(对应原页码5),最后只会把第5页添加进去,不会漏掉它。

这样不管总页数是多少,所有页面都会被正确调整顺序后添加到新PDF里啦!

备注:内容来源于stack exchange,提问作者Lavonen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:19:31