当前位置: 首页 > news >正文

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 文档。

http://www.dtcms.com/a/515559.html

相关文章:

  • 深圳展示型网站建设佛山seo优化代理
  • AI研究-110 DeepSeek-OCR 原理剖析|上下文光学压缩、Gundam 动态分辨率与并发预期 附代码
  • Easyx图形库应用(mcu+lua vs plc+st)
  • 【计算机网络笔记】第一章 计算机网络导论
  • AI搜索驱动的品牌传播变革:品牌如何在“被搜索”转向“被理解”的浪潮中重构增长力
  • 秦皇岛网站建设哪家好医疗软件公司排名
  • 将 Flask 应用迁移到 AWS Lambda:服务监控电话告警系统实战
  • PyTorch入门
  • Redis的Hash数据结构底层实现
  • AWS Lambda 预置并发配置实战分析
  • Biu懂AI:使用LangChain将Astra MCP接入LLM
  • 做租号玩网站赚钱吗wordpress tag标签
  • 安全补丁还是自造DDoS?微软更新导致关键企业功能瘫痪
  • TorchRL 安装记录(亲测有效)
  • 网站建设教程资源wordpress有插件怎么用
  • 网站建设的项目描述银川微信网站
  • Java网络编程套接字
  • npm 常用标签与使用技巧新手教程
  • 继承和组合
  • Maven高级知识
  • Spring Boot 3 + Thymeleaf 基础教程
  • 自动化部署脚本
  • 上海专业网站建设方案wordpress 送女友
  • 人与狗做的电影网站网页搭建服务
  • 前端 数据的转换
  • React useCallback介绍(用来缓存函数的引用,避免每次渲染都重新创建函数)主要用于性能优化
  • VUE工程化开发模式
  • 海口澄迈县建设局网站杭州萧山网络
  • 前端低代码开发工具的崛起与实践经验分享,从效率到可控性的平衡
  • 二、redis集群部署(3主3从)