Python 图片转 PDF 详解:单张、多张及多图片格式转换
目录
准备工作:安装图片转PDF库
单张图片转换为 PDF
将文件夹中多张图片批量转换为 PDF
调整 PDF 布局与图片位置
其他图片格式(如SVG、TIFF)转 PDF
实用方法示例:按文件名顺序生成 PDF
高级操作:图片缩放与排版
总结
在整理资料或处理图片时,你有没有遇到过这样的困扰:手机拍的照片、扫描的文档、各种格式的图片零散地散落在电脑里,想要统一管理却又不想一个个手动插入 PDF?其实,把这些图片转换成 PDF,不仅能让资料更整齐,还方便分享和归档,而且可以保证图片清晰不丢失。
这篇博客将分享如何使用 Python 将图片转换为PDF。从单张图片转换,到批量处理多张图片,再到不同格式的支持和页面布局的优化,都可以用简单的几行代码完成。
准备工作:安装图片转PDF库
要在 Python中将图片转换为PDF,需要选择一个支持将图片写入到PDF的库。本文所使用的库是Spire.PDF for Python,它是一个PDF文档处理库,功能丰富,支持插入多种图片格式,包括 PNG、JPEG、TIFF 和 SVG,还支持 PDF 页面布局自定义、批量处理和合并图片等操作。
你可以通过以下 pip 命令安装它:
pip install Spire.PDF
安装完成后,就可以在 Python 中直接调用该库的类和方法了。
单张图片转换为 PDF
如果你只需要将一张图片转换为 PDF,可以按照以下步骤操作:
- 创建 PdfDocument 对象。
- 将页面边距设置为零。
- 使用 PdfImage.FromFile() 载入图片,并获取图片尺寸。
- 添加一个与图片大小相同的 PDF 页面。
- 将图片绘制到页面上。
- 保存 PDF 文件。
下面是完整的 Python 代码示例:
from spire.pdf.common import *
from spire.pdf import *# 创建 PdfDocument 对象
pdf = PdfDocument()# 设置页面边距为 0
pdf.PageSettings.SetMargins(0.0)# 载入图片
image = PdfImage.FromFile("Sample.jpg")# 获取图片宽高
width = image.PhysicalDimension.Width
height = image.PhysicalDimension.Height# 创建与图片同大小的页面
page = pdf.Pages.Add(SizeF(width, height))# 绘制图片
page.Canvas.DrawImage(image, 0.0, 0.0, width, height)# 保存 PDF
pdf.SaveToFile("单图.pdf")
pdf.Dispose()
运行这段代码后,你就能得到与图片尺寸完全一致的 PDF 文件。
将文件夹中多张图片批量转换为 PDF
如果你有一个文件夹里存放了多张图片,需要将它们统一转换成一个 PDF,可以采用批量处理方法:
- 遍历文件夹中的图片。
- 每张图片都创建一个与其尺寸相同的 PDF 页面。
- 将图片绘制在对应页面上。
- 保存最终的 PDF 文件。
示例代码如下:
from spire.pdf.common import *
from spire.pdf import *
import os# 创建 PdfDocument 对象
doc = PdfDocument()
doc.PageSettings.SetMargins(0.0)# 图片所在文件夹
path = '图片/'
files = os.listdir(path)for root, dirs, files in os.walk(path):for file in files:# 载入图片image = PdfImage.FromFile(os.path.join(root, file))width = image.PhysicalDimension.Widthheight = image.PhysicalDimension.Height# 添加页面page = doc.Pages.Add(SizeF(width, height))# 绘制图片page.Canvas.DrawImage(image, 0.0, 0.0, width, height)# 保存 PDF
doc.SaveToFile('output/多图.pdf')
doc.Dispose()
这样,你就可以一次性将整个文件夹的图片生成一个 PDF,方便管理和分享。
调整 PDF 布局与图片位置
在一些场景下,你可能希望 PDF 页面大小统一,例如使用 A4 页面,同时将图片居中显示。可以通过设置页面大小、边距以及计算图片在页面上的位置来实现:
from spire.pdf.common import *
from spire.pdf import *pdf = PdfDocument()
pdf.PageSettings.SetMargins(5.0) # 设置边距
pdf.PageSettings.Size = PdfPageSize.A4() # 设置页面为 A4# 添加新页面
page = pdf.Pages.Add()# 载入图片
image = PdfImage.FromFile("Sample.jpg")
width = image.PhysicalDimension.Width
height = image.PhysicalDimension.Height# 计算居中位置
x = (page.GetClientSize().Width - width) / 2
y = (page.GetClientSize().Height - height) / 2# 绘制图片
page.Canvas.DrawImage(image, x, y, width, height)pdf.SaveToFile("自定义.pdf")
pdf.Dispose()
通过这种方法,你可以保证生成的 PDF 页面整齐、美观,适合打印或正式展示。
其他图片格式(如SVG、TIFF)转 PDF
除了将 PNG、JPEG、BMP等图片格式转换为 PDF 外,Spire.PDF还支持将SVG 转换为PDF。
from spire.pdf.common import *
from spire.pdf import *# 创建 PdfDocument 对象
document = PdfDocument()# 加载 SVG 文件
document.LoadFromSvg("SVG.svg")# 保存为 PDF 文件
document.SaveToFile("output/SVG.pdf", FileFormat.PDF)
document.Dispose()
如果有特殊需求,例如将 TIFF 转 PDF,你可以借助 Pillow 库(pip install pillow)先将每一页转换为 PNG,再生成 PDF:
from spire.pdf.common import *
from spire.pdf import *
from PIL import Image
import os# 创建PDF文档并移除页边距
pdf = PdfDocument()
pdf.PageSettings.SetMargins(0.0)# 加载TIFF图片,将每一帧转换为PNG并添加到PDF
tiff_image = Image.open("example.tiff")
for i in range(tiff_image.n_frames):tiff_image.seek(i)frame = tiff_image.copy()frame.save(f"temp_{i}.png")image = PdfImage.FromFile(f"temp_{i}.png")page = pdf.Pages.Add(SizeF(image.PhysicalDimension.Width, image.PhysicalDimension.Height))page.Canvas.DrawImage(image, 0.0, 0.0)# 保存文档
pdf.SaveToFile("output/TIFF转PDF.pdf")
pdf.Dispose()
通过这种方法,每一帧 TIFF 都会生成 PDF 中的一页,保证了图像质量和顺序。
实用方法示例:按文件名顺序生成 PDF
假设你有一个文件夹存放会议照片,文件名是按照时间顺序命名的。我们可以按文件名顺序,把所有图片合并到一个 PDF 中。
from spire.pdf import PdfDocument, PdfImage
from spire.pdf.common import SizeF
import os# 创建 PDF
pdf = PdfDocument()
pdf.PageSettings.SetMargins(0.0)# 图片所在文件夹
folder_path = "MeetingPhotos/"
images = sorted(os.listdir(folder_path)) # 按文件名排序for img_file in images:# 仅处理常见图片格式if img_file.lower().endswith((".jpg", ".jpeg", ".png")):image_path = os.path.join(folder_path, img_file)img = PdfImage.FromFile(image_path)# 添加与图片同尺寸页面page = pdf.Pages.Add(SizeF(img.PhysicalDimension.Width, img.PhysicalDimension.Height))page.Canvas.DrawImage(img, 0.0, 0.0, img.PhysicalDimension.Width, img.PhysicalDimension.Height)# 保存 PDF
pdf.SaveToFile("output/会议照片.pdf")
pdf.Dispose()
这样,每张图片就会生成一页,顺序严格按照文件名排列,非常适合会议照片或扫描文档的整理。
高级操作:图片缩放与排版
在实际应用中,图片大小可能不一,如果直接生成 PDF,可能出现页面空白或图片过大。可以通过缩放或调整位置,达到统一效果:
page_width, page_height = 595.0, 842.0 # A4 尺寸,单位为点for img_file in images:img = PdfImage.FromFile(os.path.join(folder_path, img_file))scale = min(page_width / img.PhysicalDimension.Width, page_height / img.PhysicalDimension.Height)width = img.PhysicalDimension.Width * scaleheight = img.PhysicalDimension.Height * scalepage = pdf.Pages.Add(SizeF(page_width, page_height))x = (page_width - width) / 2y = (page_height - height) / 2page.Canvas.DrawImage(img, x, y, width, height)
这样生成的 PDF 页面大小统一,图片居中,排版更加美观,适合打印或正式文档归档。
为了让 PDF 更专业,你还可以自动生成封面和目录。比如:
- 封面:可以先添加一页 PDF,绘制标题、日期和简单说明。
- 目录:扫描图片文件名,生成每页对应的说明,放在封面后面。
这样整理出的 PDF 就像一本正式的电子资料,不仅好看,也方便阅读。
总结
使用 Python 将图片整理成 PDF,不仅节省了手动操作时间,还能让资料更整齐、专业。无论是单张图片、批量图片,还是不同格式的图像,都可以轻松处理。通过本文示例,你可以快速整理你的图片资料,生成高质量 PDF 文档。