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)
改动说明:
- 替换
zip为zip_longest:确保所有序列的元素都被遍历,哪怕某个序列已经耗尽,用None填充空缺的位置。 - 添加有效性判断:在添加页面之前,先检查当前页码是否有效(不是
None且小于总页数),避免报错。 - 使用上下文管理器:用
with语句自动处理文件的打开和关闭,比手动调用close()更安全规范。
举个例子,如果你的PDF有5页:
- 第一组会处理页码索引1、2、3、0(对应原页码2、3、4、1)
- 第二组会处理
None、None、None、4(对应原页码5),最后只会把第5页添加进去,不会漏掉它。
这样不管总页数是多少,所有页面都会被正确调整顺序后添加到新PDF里啦!
备注:内容来源于stack exchange,提问作者Lavonen
相关产品推荐
相关产品推荐

