引言

在日常工作和学习中,我们经常需要将多张图片合并成一个PDF文件,以便于分享或打印。Python提供了多种库来实现这一需求,本文将详细介绍三种常用的方法:img2pdf库Pillow库PyMuPDF库,并附上完整的代码示例。

方法一:使用img2pdf库

简介

img2pdf是一个专门用于将图片转换为PDF的高效工具,支持多种图片格式(如JPEG、PNG等),且转换过程中不会损失图片质量。

安装

pip install img2pdf

代码示例

import img2pdf# 定义图片路径列表
image_paths = ['image1.jpg', 'image2.png', 'image3.jpeg']# 将图片转换为PDF字节流
pdf_bytes = img2pdf.convert(image_paths)# 保存为PDF文件
with open('output.pdf', 'wb') as f:f.write(pdf_bytes)print("PDF文件已成功生成!")

优势

  • 高效快速:直接将图片数据嵌入PDF,无需重新编码。
  • 无损转换:保持原始图片质量。
  • 支持多图:自动将多张图片分页到同一PDF中。

方法二:使用Pillow库

简介

Pillow是Python中常用的图像处理库,支持打开、编辑和保存多种图片格式,也可用于将图片转换为PDF。

安装

pip install Pillow

代码示例(单张图片)

from PIL import Image# 打开图片
image = Image.open('input.jpg')# 保存为PDF(默认分辨率72DPI)
image.save('output.pdf', 'PDF', resolution=300)  # 设置分辨率为300DPIprint("单张图片已转换为PDF!")

代码示例(多张图片合并)

from PIL import Image
import os# 定义图片路径列表
image_paths = ['image1.jpg', 'image2.png', 'image3.jpeg']# 打开所有图片并转换为RGB模式
images = [Image.open(img).convert('RGB') for img in image_paths]# 保存第一张图片为PDF,并追加剩余图片
images[0].save('combined.pdf','PDF',save_all=True,append_images=images[1:]
)print("多张图片已合并为PDF!")

注意事项

  • 分辨率调整:通过resolution参数可优化PDF清晰度。
  • 模式转换:确保图片为RGB模式,否则可能无法保存为PDF。

方法三:使用PyMuPDF库

简介

PyMuPDF(即fitz)是一个功能强大的PDF处理库,支持添加图片、调整页面布局等高级操作。

安装

pip install pymupdf

代码示例

import fitz  # PyMuPDF的别名# 创建空白PDF文档
doc = fitz.open()# 添加图片到PDF
for img_path in ['image1.jpg', 'image2.png']:img = fitz.open(img_path)  # 打开图片rect = fitz.Rect(0, 0, img.media_box.width, img.media_box.height)page = doc.new_page(width=rect.width, height=rect.height)  # 创建新页面page.insert_image(rect, filename=img_path)  # 插入图片# 保存PDF
doc.save('output.pdf')
doc.close()print("PDF文件已生成!")

优势

  • 灵活布局:可自定义页面大小、边距等。
  • 高级功能:支持添加水印、合并PDF等操作。

方案对比

方法适用场景优点缺点
img2pdf批量转换、追求速度和无损质量快速、高效、无损仅支持基础转换
Pillow单张图片转换、简单合并轻量级、易用多图合并需额外处理
PyMuPDF需要定制PDF布局或高级功能功能强大、灵活学习成本稍高

常见问题解答

1. 如何调整PDF的页面大小?

  • img2pdf:通过layout_fun参数自定义布局(需指定纸张尺寸)。
  • PyMuPDF:在new_page中设置widthheight参数。

2. 转换后的PDF文件过大怎么办?

  • 使用img2pdf时,确保图片格式为JPEG或PNG(已压缩格式)。
  • 通过Pillowsavefig参数调整分辨率(如dpi=150)。

3. 支持哪些图片格式?

  • 所有方法均支持JPEG、PNG、BMP等常见格式。
  • img2pdf还支持TIFF、WebP等格式。

总结

  • 推荐方案
    • 批量转换:优先使用img2pdf库。
    • 简单需求:选择Pillow库。
    • 高级定制:使用PyMuPDF库。

通过本文的三种方法,您可以轻松实现图片到PDF的转换,并根据具体需求选择最合适的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94914.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94914.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94914.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python如何合并两个Excel文件

引言 在日常数据处理中,合并Excel文件是常见需求。Python提供了多种库(如pandas、openpyxl)来实现这一操作。本文将详细介绍两种主流方法,并附上完整代码示例,帮助您高效完成Excel合并任务。 方法一:使用pa…

【SQL进阶】用EXPLAIN看透SQL执行计划:从“盲写“到“精准优化“

用EXPLAIN洞察SQL执行计划:从"盲目编写"到"精准优化" 很多开发者在编写SQL时仅凭直觉,直到查询超时才发现问题。MySQL内置的EXPLAIN工具能提前揭示查询执行逻辑,帮助预防性能隐患。本文将带你掌握EXPLAIN的核心用法&…

电影艺术好,电影知识得学

关于电影应该谈什么导演风格、演员技术、剧本结构、票房、政治因素等。一、纸上谈电影电影制作期:研发、前制、拍摄、后制、发行。一般成员只在某个时期出现。制片和导演会从头监督到尾。研发期: 剧本概念发想与成形的时期。创作自由度比较大&#xff0c…

FPGA学习笔记——简易的DDS信号发生器

目录 一、任务 二、分析 三、ROM IP核配置 四、Visio图 五、代码 (1).v代码 (2)仿真代码 六、仿真 七、实验现象 一、任务 用串口模块,用上位机发送指令,FPGA接收,然后输出对应的波形&…

在NVIDIA Orin上用TensorRT对YOLO12进行多路加速并行推理时内存泄漏 (中)

接上篇 在NVIDIA Orin上用TensorRT对YOLO12进行多路加速并行推理时内存泄漏(上) 通过上篇的分析,发现问题在采集数据到传入GPU之前的阶段。但随着新一轮长时间测试发现,问题依然存在。 如上图,在运行20多分钟内存开始…

计数组合学7.17(Murnaghan–Nakayama 规则 )

7.17 Murnaghan–Nakayama 规则 我们已经成功地用基 mλm_\lambdamλ​、hλh_\lambdahλ​ 和 eλe_\lambdaeλ​ 表示了 Schur 函数 sλs_\lambdasλ​。本节我们将考虑幂和对称函数 pλp_\lambdapλ​。一个斜分划 λ/μ\lambda / \muλ/μ 是连通的,如果其分拆图…

使用 jlink 构建轻巧的自定义JRE

从 JDK 9 开始,Oracle JDK 和 OpenJDK 不再默认包含独立的 JRE 目录,而是提供了 jlink 工具(Java 链接器),允许你根据需求自定义生成最小化的 JRE(包含必要的模块)。以下是使用 jlink 生成 JRE …

[IOMMU]面向芯片/SoC验证工程的IOMMU全景速览

面向芯片/SoC验证工程的IOMMU全景速览 摘要:面向芯片/SoC 验证工程的 IOMMU 全景速览:包含基础概念、主流架构要点(ARM SMMU、Intel VT‑d、RISC‑V IOMMU),Linux 软件栈关系,SoC 上的验证方法(功能、错误、性能、系统化流程和覆盖),以及一个可用的“通用 IOMM…

Jenkins全链路教程——Jenkins用户权限矩阵配置

在企业级CI/CD场景中,“权限混乱”往往比“构建失败”更致命——测试员误删生产流水线、实习生修改关键插件配置、多团队共用账号导致责任无法追溯……这些问题,99%都能用权限矩阵彻底解决!今天,我们不仅会拆解权限矩阵的底层逻辑…

库函数蜂鸣器的使用(STC8)

使用库函数控制蜂鸣器(STC8) 在STC8系列单片机中,可以通过库函数或直接操作寄存器来控制蜂鸣器。以下是基于STC8库函数的常用方法: GPIO板蜂鸣器 #include "GPIO.h" #include "Delay.h"void GPIO_config()…

redis8.0.3部署于mac

macOS11因版本过低,安装redis时,Homebrew和源码编译两种方式都无法成功。将操作系统升级至macOS15再安装。Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值…

【和春笋一起学C++】(三十三)名称空间的其他特性

目录 嵌套式名称空间 拓展——未命名的名称空间 嵌套式名称空间 示例代码1: namespace electronicEquipment {namespace computer{double price 4999.0;string modelNumber;string name;}namespace ElectronicWatch{double price 99.0;string modelNumber;stri…

异步电动机负载运行特性全解析

异步电动机负载运行特性详解 ——从空载到负载的完整分析一、为什么需要再谈“负载运行” 在上一篇《感应电动机空载特性深度剖析》中,我们已经看到:空载时,若定子加额定电压,转子转速 $n \approx n_s$(同步转速&#…

使用 Ansys Discovery 进行动态设计和分析

Ansys Discovery 是一款多功能工具,为创建模型、探索仿真设计和分析解决方案提供了一个单一的交互式工作区。它允许用户使用直接建模技术创建和修改几何结构,定义仿真并与结果实时交互。Discovery 支持结构、流体流动、热和电磁设计,提供直观…

力扣热题100-----118.杨辉三角

案例 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 提示: 1 …

NTP /Chrony 网络时间协议

一、NTP(network time protocol)网络时间协议:实现时间同步,让设备时间与国际标准时间保持一致设备日志、服务日志需要记录时间分布式系统(分布式数据库、分布式缓存、分布式储存、消息队列)时间戳&#xf…

VSCode 刷 LeetCode 算法题配置教程

LeetCode 在线刷题地址:https://leetcode-cn.com/ 一、安装 Node.js 环境 LeetCode 插件依赖 node.js 运行环境,因此必须先安装: 前往官网下载安装:https://nodejs.cn/download/下载好的压缩包解压,可以看到当前文件…

非常简单!从零学习如何免费制作一个lofi视频

想必大家在网上会看到如下类似的音乐频道,这类频道都只是上传简单的Lo-Fi音乐带着循环播放的背景就可以赚钱。 那么上面的效果如何实现的呢?今天做一个可以免费制作lo-Fi音乐的教程。 Lo-Fi音乐: Lo-Fi音乐是一种以低保真度和模拟音色为特点…

基于 RAUC 的 Jetson OTA 升级全攻略

📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》 🎥 更多学习视频请关注 B 站:嵌入式Jerry 基于 RAUC 的 Jetson OTA 升级全攻略 0. 引子:常见问题 在 Jetson 平台做 OTA 升级时,你可能会问&…

MySQL 主备(Master-Slave)复制 的搭建

一、主备架构简介 Master(主库):负责处理所有写操作(INSERT/UPDATE/DELETE),并记录二进制日志(binlog)。Slave(备库):从主库拉取 binlog&#xff…