如何用Python按16页片段合并两个拆分得到的PDF文件
解决方案
核心思路
将两个PDF的页序列按16页为单位拆分成分片,再按「奇数PDF分片→偶数PDF分片」的顺序交替拼接所有分片,即可得到符合顺序要求的完整PDF。
完整可运行代码
import itertools as itt import sys import PyPDF2 as PDF def chunked(iterable, chunk_size): """将迭代对象按指定大小拆分为分片""" iterator = iter(iterable) while True: chunk = list(itt.islice(iterator, chunk_size)) if not chunk: break yield chunk def main(): fbase = sys.argv[1] pdf_out = PDF.PdfFileWriter() # 分片大小固定为16页 CHUNK_SIZE = 16 with open(fbase + "_odd.pdf", 'rb') as f_odd, open(fbase + "_even.pdf", 'rb') as f_even: pdf_odd = PDF.PdfFileReader(f_odd) pdf_even = PDF.PdfFileReader(f_even) # 先将两个PDF的页按16页为单位拆分成分片 odd_chunks = chunked(pdf_odd.pages, CHUNK_SIZE) even_chunks = chunked(pdf_even.pages, CHUNK_SIZE) # 交替拼接奇数分片、偶数分片 for odd_chunk, even_chunk in itt.zip_longest(odd_chunks, even_chunks): if odd_chunk: for page in odd_chunk: pdf_out.addPage(page) if even_chunk: for page in even_chunk: pdf_out.addPage(page) with open(fbase + ".pdf", 'wb') as f_out: pdf_out.write(f_out) return 0 if __name__ == "__main__": if len(sys.argv) != 2: print("Wrong number of arguments!") sys.exit(1) sys.exit(main())
改动说明
- 新增了通用的分片工具函数
chunked,可自定义分片大小,这里设为16适配你的业务需求 - 替换了原有的逐页交叉逻辑,改为按分片交叉,同时保留了边界兼容逻辑,即使最后一个分片不足16页、或两个PDF的分片数量不一致也能正常运行
- 合并了多层with语句,代码结构更简洁
内容的提问来源于stack exchange,提问作者slick
相关产品推荐
相关产品推荐

