使用img2pdf生成PDF时图片顺序错乱问题求助
解决img2pdf生成PDF时图片顺序错乱的问题
嘿,这个问题我之前也踩过坑!核心原因是文件名的字符串排序逻辑——当你直接用默认的文件名列表传给img2pdf时,它会按字符串的字典序排序,而不是我们期望的数字顺序。比如img1.jpg和img10.jpg,字符串比较时"10"会排在"2"前面,就出现了1、10、11…这种混乱的顺序。
问题分析
看你的代码,你是按数字顺序下载了img1.jpg到img50.jpg,但如果后续生成PDF时是直接读取文件夹里的文件(比如用os.listdir()),或者没有手动指定有序的文件列表,就会触发字符串排序的问题。
解决方案
最稳妥的方式是手动生成按数字顺序排列的文件列表,完全绕开文件系统的排序逻辑:
import urllib.request import os import img2pdf n = 50 all = 0 # 先下载图片 for counter in range(1, n+1): all = all + 1 urllib.request.urlretrieve(f"https://website/images/{all}.jpg", f"img{all}.jpg") # 生成严格按数字顺序的文件名列表 image_files = [f"img{i}.jpg" for i in range(1, n+1)] # 用有序列表生成PDF with open("output.pdf", "wb") as f: f.write(img2pdf.convert(image_files))
如果是需要从文件夹读取已有的图片文件,也可以通过提取文件名中的数字来排序:
import os import img2pdf # 获取所有符合命名规则的图片文件 files = [f for f in os.listdir() if f.startswith("img") and f.endswith(".jpg")] # 按文件名中的数字进行排序 files.sort(key=lambda x: int(x.replace("img", "").replace(".jpg", ""))) # 生成PDF with open("output.pdf", "wb") as f: f.write(img2pdf.convert(files))
这样就能保证PDF里的图片严格按照1、2、3…50的顺序排列啦!
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

