资源中心

图片生成 PDF:高效文件转换的秘密武器

在现在这个数字化时代,图片和 PDF 绝对是日常最常用的两类文件格式。平时工作里经常会碰到一堆截图、扫描照片,想要打包合并起来,方便归档、分享或者发给客户,这时候把图片转成 PDF 就很有必要了。图片转 PDF 之后,不管是存储、传输,还是保护内容,都会方便不少。这篇文章就聊聊怎么用 Python 实现图片转 PDF,顺带说说为啥这个方案在很多场景下比在线转换工具好用太多。

一、为什么使用 Python 将图片转为 PDF?

Python 本身是一门功能很强的编程语言,配套的第三方库特别多,处理图片、PDF 这类文件都不在话下。拿 Python 来做图片转 PDF,好处真不少。

高效性

Python 属于解释型语言,写代码、调试都比编译型语言省事很多,不用复杂的编译步骤。要是手上有几十上百张图片要批量转 PDF,写一小段脚本跑起来,速度比手动一张张上传在线工具快得多,不用反复点按钮,也不用等网页加载。

灵活性

Python 生态里面各种库很全,像 JPG、PNG 这些常见图片格式基本都能搞定。而且它还能和别的工具、脚本串起来,比如读取文件夹里所有图片、自动排序,按你的需求定制流程。不像在线网站,大多只能按它固定的规则转换,限制很多。

可扩展性

Python 的库资源很丰富,后续想加功能很简单。比如后面想要加上图片压缩、给 PDF 加水印、批量重命名这些需求,不用完全重写代码,找对应的库稍微改改就行。对于经常要处理图片转 PDF 的开发或者运营人员,这点真的很香。

绕开在线工具的几个坑

不过这里也要提一句,网上很多在线转换网站有坑,要么有文件大小限制,上传多了就要收费,还有的会偷偷留存你的图片资料,敏感文件千万别随便传。用本地 Python 脚本跑,文件都在自己电脑上,可控性和安全性会高很多。

二、如何使用 Python 将图片转为 PDF?

用 Python 实现图片转 PDF 的方式有好几种,这里给大家讲最常用的一套方案,用到 Pillow 和 PyPDF2 两个库,分工很清晰:Pillow 负责读图、处理和写出 PDF 页面,PyPDF2 负责把多个 PDF 拼到一起,上手门槛不算高。

第一步:安装依赖库

直接打开终端,用 pip 命令就能安装:

pip install Pillow PyPDF2

顺带说一句,PyPDF2 从 3.0 起官方已经更名为 pypdf,老教程里的 PyPDF2 依旧能装上能用,但新版 pypdf 里 PdfMerger 已经并进了 PdfWriter。新项目建议直接 pip install pypdf,并用下面第三节的写法。

第二步:读取本地图片

安装完之后,就可以写代码了。首先导入 Pillow 里面的 Image 类,读取本地图片文件。举个例子,读取同目录下 image.jpg 这张图:

from PIL import Image

image = Image.open("image.jpg")

拿到图片对象之后,建议先统一转成 RGB 模式——PNG 如果带透明通道(RGBA),直接写 PDF 会报错:

image = Image.open("image.jpg").convert("RGB")

第三步:把图片写成 PDF

单张图片最简单,Pillow 直接保存成 PDF 就行,resolution 用来告诉 PDF 这张图的参考分辨率:

image.save("output.pdf", "PDF", resolution=100.0)

批量转换:一次合成多张

真正实用的场景是批量。把文件夹里的图片按顺序读进来,用 save_all 一次合成一个多页 PDF,几十张图也就几行代码:

from PIL import Image
from pathlib import Path

files = sorted(Path("./images").glob("*.jpg"))
pages = [Image.open(f).convert("RGB") for f in files]

pages[0].save(
    "output.pdf", "PDF",
    save_all=True,
    append_images=pages[1:],
    resolution=100.0,
)

这里有几处要注意:sorted() 决定页码顺序,文件名最好统一用两位序号(01.jpg、02.jpg),别依赖系统默认的遍历顺序,不同操作系统返回的顺序可能不一样。

用 PyPDF2 / pypdf 合并多个 PDF

如果手上是几个已经生成好的 PDF,要用脚本拼成一份,这才是 PyPDF2 的主场。新版 pypdf 统一用 PdfWriter(老版本对应 PdfMerger):

# pypdf 3.0+ / PyPDF2 新版写法
from pypdf import PdfWriter

writer = PdfWriter()
for item in ["part1.pdf", "part2.pdf", "part3.pdf"]:
    writer.append(item)

with open("merged.pdf", "wb") as f:
    writer.write(f)
writer.close()

# 老版本 PyPDF2 的写法
# from PyPDF2 import PdfMerger
# merger = PdfMerger()
# for item in ["part1.pdf", "part2.pdf"]:
#     merger.append(item)
# merger.write("merged.pdf")
# merger.close()

常见报错与踩坑

很多新手在这一步容易卡住,八成是下面这几个原因:

  • 路径写错:用相对路径时,"当前目录"是你运行脚本的位置,不是脚本文件所在位置。路径里有中文或空格,建议统一用 pathlib。
  • 图片模式不对:RGBA、CMYK 直接写 PDF 会抛错,保存前一律 .convert("RGB")。
  • 库版本不兼容:部分老旧版本没有相关方法,运行报错先升级库,别急着怀疑自己代码写错了,很多人就是栽在这一步。
  • 文件体积暴涨:图片分辨率特别大就直接塞进 PDF,最终体积会翻好几倍。最好先用 Pillow 缩放一轮,或者转前做一次有损压缩。
  • 重复压缩:源图已经是 JPEG 时,来回保存会累积画质损失,能拿到原图就优先用原图。

三、脚本方案和在线工具怎么选

总的来说,Python 脚本做图片转 PDF,很适合需要批量处理、有隐私要求,或者需要嵌入到项目流程里面的场景。简单几行代码就能跑通,后续还能自由改功能。对比网页工具,虽然需要一点点代码基础,但胜在可控、安全,长期频繁处理文件的话,能省下超多重复操作的时间。

如果只是偶尔转一次、不想折腾环境,那直接用在线工具更划算。这里也能顺手地把活干完:

  • 图片转 PDF:多选拖拽、随时调整页码顺序,选好 A4 版式和页边距就能合成。
  • 图片压缩:先在源头把原图压小再转 PDF,最终体积更好控。
  • PDF 压缩:已经合并好的 PDF 再压一轮,邮件附件就不容易超限。
  • 合并与拆分 PDF:不想写 PyPDF2 脚本时,用它把几份 PDF 拼成一份。

四、常见问题

Python 转出来的 PDF 文件太大,怎么压?

先在源头处理:用 Pillow 把图片缩放到合适尺寸、转 RGB 模式再保存,必要时降低 JPEG 质量;已经生成好的 PDF,可以再做一轮 PDF 压缩,效果比反复调 PowerPoint 明显。

图片转 PDF 一定要用 PyPDF2 吗?

不一定。单张或批量图片合成 PDF,用 Pillow 的 save(save_all=True, append_images=...) 就够了;只有需要把多个已有 PDF 拼在一起、或者做拆分旋转时才用 PyPDF2。注意它从 3.0 起官方更名为 pypdf,并且新版里 PdfMerger 已并入 PdfWriter.append()。

批量转换时怎么控制图片的先后顺序?

别依赖文件夹的默认遍历顺序,先把文件名按统一规则排好序(日期或序号),再用 sorted() 读取;顺序要求严格时,直接维护一个文本文件清单,脚本按清单逐行读取。

不想写代码,有没有更省事的图片转 PDF 方法?

有。直接用在线的图片转 PDF工具,拖进去排好序就能导出,不用装任何环境;敏感文件要留意是否上传到了对方服务器,优先选明确不留存文件、处理完即释放的工具。

五、总结

图片生成 PDF 这件事,一次两张图用在线工具最快,几十上百张、还带隐私要求,写一段 Python 脚本才是真正的省力。掌握 Pillow 出页面、PyPDF2(或 pypdf)做合并这套组合拳之后,批处理、自动排序、后续加水印加密这些需求都能一路扩展下去,不用再回到一个个点按钮的老路上。

不写代码也没关系,FreeConvertBox 的图片转 PDF工具几步就能把一堆图片合成一个 PDF,即开即用不留存,隐私安全有保障。站内还有图片压缩、图片格式转换、PDF 合并拆分、证件照制作、二维码生成等十几个免费工具,不必为每一种格式再装一个软件。

说明:部分素材由 AI 辅助生成。


免费转换器工具箱 图片转 PDF、图片格式转换