利用python将图片转换为pdf格式的多种方法,实现批量转换,内置模板代码,全网最全,超详细!!!

news2025/1/5 8:24:35

文章目录

  • 前言
  • 1、img2pdf库的使用
    • 1.2 安装img2pdf库
    • 1.3 案例演示(模板代码)
  • 2、Pillow库的使用
    • 2.1 pillow库的安装
    • 2.2 案例演示(模板代码)
  • 3、PyMuPDF库的使用
    • 3.1 安装pymupdf库
    • 3.2 案例演示(模板代码)
    • 2.3 扩展:将多张图片完美拼接到一张pdf页面上,没有间隙

前言

在python中将图片转换为pdf格式的方法有多种,每种方法依赖于不同的库和工具,本篇文章我将介绍三种常用的库,包括img2pdf 库 和 pillow库、PyMuPDF(fitz)库 ,下面我将通过实际案例教会大家如何使用这三种库,同时针对每一种库不同的转换方法,准备相应的模板代码,让新手小白也能轻松驾驭。

图片准备: 可以看到我在下面准备了4张图片,后续案例中使用的都是这4张图片

在这里插入图片描述

1、img2pdf库的使用

在Python中,img2pdf 是一个方便的库,用于将图片转换为 PDF 格式。它基于 Pillow(PIL 的一个分支)库,并提供了一个简单的接口来完成图片到 PDF 的转换。

1.2 安装img2pdf库

命令:pip install img2pdf

1.3 案例演示(模板代码)


案例演示:

# 1、导入模块
from img2pdf import convert

# 2、准备图片路径列表,将需要转换的图片路径全部放进一个列表中,若只有一张图片,同样也将其路径放入列表中即可
image_paths = ['all_images/01.png', 'all_images/02.png', 'all_images/03.png','all_images/04.png']

# 3、使用convert函数将图片文件列表转换为 PDF,这里我们直接传递图片文件路径的列表
pdf_bytes = convert(image_paths)
# 注意:convert 函数只能接受一个图片文件对象的列表,或者一个包含图片文件路径的列表

# 3、将转换后的图片,保存到指定路径下的pdf文件中
with open('output.pdf', 'wb') as pdf_file:
    pdf_file.write(pdf_bytes)

print("PDF 文件已成功创建!")

执行效果:
在这里插入图片描述

说明:
我们可以看到,img2pdf库的使用是非常简单的,它会将每张图片作为 PDF 文件中的一个独立页面进行添加,有多少张图片就会生成多上张pdf页面

2、Pillow库的使用

通过 Pillow 库,你可以轻松地将单张或多张图片转换为 PDF 格式。这种方法简单高效,适合大多数图片转 PDF 的需求。如果需要更复杂的 PDF 操作(如添加文本、表格等),可以考虑结合 reportlab 库使用,这里我就不详细说明了,大家可以自行扩展。

2.1 pillow库的安装

命令:pip install Pillow

2.2 案例演示(模板代码)


案例1:将单张图片转换为 PDF

# 1、导入模块
from PIL import Image

# 2、准备图片路径
image_path = 'all_images/01.png'

# 3、准备输出的 PDF 路径
output_pdf_path = 'output.pdf'

# 4、打开图片,生成图片对象
image = Image.open(image_path)

# 5、将图片转换为pdf格式,并保存至指定路径
image.save(output_pdf_path, "PDF", resolution=100)
'''
参数说明:
    参数1:保存路径
    参数2:保存格式
    参数3:resolution,该参数用于设置pdf的分辨率,不写默认为75pdi
'''
print(f"图片已成功转换为 PDF: {output_pdf_path}")

执行效果:

在这里插入图片描述


案例2:将多张图片合并为一个 PDF

# 1、导入模块
from PIL import Image

# 2、准备图片路径列表
image_paths = ['all_images/01.png', 'all_images/02.png', 'all_images/03.png','all_images/04.png']

# 3、准备输出的 PDF 路径
output_pdf_path = 'output.pdf'

# 4、打开所有图片并使用convert函数将其转换为 RGB 模式,最后全部存入images列表中
images = [Image.open(image).convert('RGB') for image in image_paths]
# 因为pdf需要RGB格式,所以这里需要将其进行转换

# 5、将第一张图片保存为 PDF,并追加其他图片
images[0].save(output_pdf_path, save_all=True, append_images=images[1:]) # 先将第一张图片保存为pdf文件,在通过append_images参数将剩余的图片追加进去
'''
参数说明:
    参数1:保存路径
    参数2:save_all=True,表示将所有图片都存入一个pdf文件中
    参数3:append_images=图片对象列表,指定要追加的图片对象列表
'''

print(f"多张图片已成功合并为 PDF: {output_pdf_path}")

执行效果:
在这里插入图片描述

说明:
通过上面的案例,我们很轻松的通过pillow库将图片转换为了pdf格式,其中参数的使用也非常简单,但大家可能会对 resolution 参数 抱有疑问,接下来我将针对该参数为大家进行详细说明,如下:

在使用 Pillow 库将图片转换为 PDF 格式时,resolution 参数用于指定输出 PDF 的分辨率(DPI,Dots Per Inch)。分辨率决定了图片在 PDF 中的清晰度和尺寸。

resolution 参数的作用

  1. 控制图片的清晰度:

    分辨率越高,图片在 PDF 中显示的细节越清晰。

    分辨率越低,图片可能会显得模糊或像素化。

  2. 影响图片的尺寸:

    分辨率越高,图片在 PDF 中显示的尺寸越小(因为每英寸的像素点更多)。

    分辨率越低,图片在 PDF 中显示的尺寸越大。

  3. 默认值:

    如果未指定 resolution 参数,Pillow 会使用默认的分辨率(通常是 72 DPI)。

注意事项

  • 图片质量:

    分辨率不会改变原始图片的像素数据,但会影响其在 PDF 中的显示效果。

    如果原始图片的分辨率较低,即使设置高 resolution 参数,也无法提高其清晰度。

  • 文件大小:

    分辨率越高,生成的 PDF 文件可能越大。

  • 默认分辨率:

    如果不指定 resolution 参数,Pillow 会使用默认的 72 DPI。

总结
resolution 参数用于控制图片在 PDF 中的清晰度和显示尺寸。通过调整分辨率,可以优化 PDF 的显示效果,适应不同的需求(如打印或屏幕查看)。在实际使用中,建议根据具体场景选择合适的分辨率值。

3、PyMuPDF库的使用

PyMuPDF(fitz)库提供了强大的PDF和图像处理能力,它是一个强大的PDF处理库,它允许你读取、修改和创建PDF文件。它也支持从图片创建PDF。

3.1 安装pymupdf库

命令:pip install pymupdf

3.2 案例演示(模板代码)


案例1:将一张图片转换为pdf格式

方法1:

# 1、导入模块
import fitz

# 2、打开一个新的PDF文档
pdf_document = fitz.open()

# 3、加载图像文件,生成图片对象
image_file = fitz.open('all_images/01.png') # 替换为需要转换的图片路径

# 4、使用convert_to_pdf函数将图片文件对象转换为pdf格式
image_pdf = image_file.convert_to_pdf()

# 5、以pdf格式打开转换后的图像,生成pdf对象
pdf = fitz.open('pdf', image_pdf)

# 6、向pdf文档中插入pdf对象
pdf_document.insert_pdf(pdf)

# 7、将PDF文档保存至指定路径
pdf_document.save('output.pdf')  # 替换为你想要保存的PDF路径

# 8、关闭图片文件和pdf文档,这两步默认可不写,但为了代码规范,我们可以加上
image_file.close()
pdf_document.close()

print('图片已转换为pdf文档!')

执行效果:
在这里插入图片描述


方法2:

# 1、导入模块
import fitz

# 2、打开一个新的PDF文档
pdf_document = fitz.open()

# 3、加载图像文件
image_file = fitz.open('all_images/01.png') # 替换为你的图像路径

# 4、加载图像所在的页面(通常是第一页),一般图片只有一页
image_page = image_file.load_page(0)

# 5、获取图像的矩形区域(尺寸和位置,但这里我们可能只关心尺寸)
image_rect = image_page.rect
print(image_rect) # 返回 Rect(0.0, 0.0, 595.25, 841.75),前两个数字代表图片左上角的坐标,后两个数字代表图片右下角的坐标,同时也是图片的宽度和高度
'''
    方法说明:根据下面看两种方法可以得到图片宽度和高度
    1、image_rect.width:获取图片的宽度,595.25
    2、image_rect.height:获取图片的宽度,841.75
'''

# 6、创建一个新的PDF页面,这里我们指定其尺寸与图像相同(或根据需要调整)
pdf_page = pdf_document.new_page(width=image_rect.width, height=image_rect.height)
'''
参数说明:
    参数1:width,指定pdf页面的宽度
    参数2:height:指定pdf页面的高度
'''

# 7、在PDF页面上插入图像
# 注意:这里我们假设图像应该覆盖整个页面,因此使用pdf_page.rect作为插入区域
pdf_page.insert_image(rect=pdf_page.rect, filename='all_images/01.png', stream=None)
'''
参数说明:
    参数1:rect= ,指定图片插入的位置,通常为pdf页面的矩形区域,也可以是图片的矩形区域,这里两者相同
    参数2:filename = 图片路径,指定要插入的图片
    参数3:stream=None,默认参数,表示允许指定图片以二进制格式插入pdf文档中
'''

# 8、保存PDF文档
pdf_document.save('output.pdf')

# 9、关闭图像文件和pdf文档,默认可不写,这里为了代码规范,我们可以写上
image_file.close()
pdf_document.close()

print('图片已转换为了pdf文档!')

执行效果:

在这里插入图片描述


案例2:将多张图片转换为pdf文档

# 1、导入模块
import fitz

def images_to_pdf(image_paths, output_pdf):
    # 创建一个新的 PDF 文档
    pdf_document = fitz.open()
    
    # 遍历每一个图片路径
    for image_path in image_paths:
        # 打开图像文件,生成图片对象
        img = fitz.open(image_path)
        # 选择图片的第一页,生成矩形区域,用于获取图片的尺寸
        img_page = img.load_page(0).rect

        # 生成一张与图片大小相同的空白pdf页面         
        pdf_page = pdf_document.new_page(width=img_page.width, height=img_page.height)  # 根据图像大小设置页面尺寸

        # 将图像插入到 PDF 页面的指定位置(这里插入到页面的左上角)
        # 注意:如果图像大小与页面大小不匹配,可能需要调整 rect 参数以进行裁剪或缩放
        pdf_page.insert_image(rect=fitz.Rect(0, 0, pdf_page.rect.width, pdf_page.rect.height), filename=image_path,
                              stream=None)
        '''
        说明:
        rect = fitz.Rect(0, 0, pdf_page.rect.width, pdf_page.rect.height) 
        # 通过fitz.Rect方法可以手动调节图片插入的位置,前两个数字为图片左上角的坐标,后两个数字为图片右下角的坐标,这里就是pdf页面的宽度和高度
        '''
        
        # 关闭图像文件(对于 pymupdf,这通常是自动处理的,但显式关闭是个好习惯)
        img.close()

    # 保存 PDF 文档
    pdf_document.save(output_pdf)
    # 关闭 PDF 文档(对于 pymupdf,这也通常是自动处理的,但显式关闭可以避免潜在的资源泄露)
    pdf_document.close()


# 2、准备图片路径列表
image_paths = ['all_images/01.png', 'all_images/02.png', 'all_images/03.png','all_images/04.png']  # 替换为要转换的图片路径  

# 3、替换为你想要输出的 PDF 文件名
output_pdf = 'output.pdf'

# 4、调用函数,并传入参数
images_to_pdf(image_paths, output_pdf)

执行效果:
在这里插入图片描述

2.3 扩展:将多张图片完美拼接到一张pdf页面上,没有间隙

通过前面的学习,我们已经掌握了三种将图片转换为pdf格式的方法,这三种方法都有一个共同点,它们会将每一张图片单独生成一张pdf页面,有多少张图片就会有多少张pdf页面,且每张pdf页面间都会有一段空白的填充区来分隔每张pdf页面,但是有时我们需要将多张连贯的图片转换为pdf格式,这时若按照原来的方法操作,每张图片间就会出现空白部分,影响观感,所以接下来我会依照这个问题,给出解决方法。

问题演示

在这里插入图片描述


解决方法(模板代码)

# 1、导入模块
import fitz

def images_to_single_pdf_page(image_paths, output_pdf):
    # 打开一个新的PDF文档
    pdf_document = fitz.open()

    # 初始化pdf页面总高度和最大宽度
    total_height = 0
    max_width = 0


    # 遍历所有图片文件以计算总高度和最大宽度(垂直拼接)
    for img_file in image_paths:
        # 打开图片文件,生成图片对象
        img_document = fitz.open(img_file)
        # 选择图片的第1页,一般图片都只有1页
        img_page = img_document.load_page(0)
        # 得到图片的矩形区域,用于获取图片的尺寸
        img_rect = img_page.rect

        # 获取图片的宽度和高度
        img_width, img_height = img_rect.width, img_rect.height

        # 累加高度并更新最大宽度
        total_height += img_height
        if img_width > max_width:
            max_width = img_width

        # 关闭图片文档
        img_document.close()

    # 创建一个新的PDF页面,大小足以容纳所有图片
    pdf_page = pdf_document.new_page(width=max_width, height=total_height)

    # 初始化当前y位置,用于定义图片左上角的坐标
    current_y = 0
    # 初始化图片高度,用于定义图片右下角的坐标
    point_height = 0

    # 遍历所有图片文件并在PDF页面上绘制它们,不留空白
    for img_file in image_paths:
        # 打开图片文件,生成图片对象
        img_document = fitz.open(img_file)
        # 指定图片第一页,并形成矩形区域
        img_page = img_document.load_page(0).rect

        # 累加高度
        point_height += img_page.height

        # 在PDF页面上绘制图片(紧密排列,不留空白)
        pdf_page.insert_image(rect=fitz.Rect(0,current_y, img_page.width, point_height),filename=img_file, stream=None)
        '''
	    说明:
	    这里通过改变current_y 和 point_height 使图片依次垂直拼接在一张pdf页面上
	    (0,current_y):表示每张图片插入pdf页面左上角的坐标
	    (img_page.width, point_height):表示每张图片插入pdf右下角的坐标
	    '''

        # 更新当前y位置以放置下一张图片(直接跳到下一张图片的起始位置)
        current_y += img_page.height

        # 关闭图片文档
        img_document.close()

    # 保存PDF文档至指定位置
    pdf_document.save(output_pdf)

    # 关闭PDF文档
    pdf_document.close()


# 2、准备好图片路径列表
image_paths = ['all_images/01.png', 'all_images/02.png', 'all_images/03.png','all_images/04.png']  # 替换为要转换的图片路径

# 3、替换为你想要输出的PDF文件路径
output_pdf = "output_all.pdf"

# 4、调用函数,传入参数
images_to_single_pdf_page(image_paths, output_pdf)

print('所有图片已全部拼接至一张pdf页面上!!!')

执行效果:
在这里插入图片描述

说明:
从上面我们可以看到,所有图片在转换为pdf格式后,全部拼接在了一张pdf页面上,且每张图片间没有空隙。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

协议幻变者:DeviceNet转ModbusTCP网关开启机器手臂智能新纪元

技术背景DeviceNet是一种广泛应用于工业自动化领域的现场总线标准,它能够实现控制器与现场设备之间的高效通信,常用于连接各种传感器、执行器以及其他工业设备,如机器人、电机驱动器等,具有实时性强、可靠性高的特点。而ModbusTCP…

Linux 安装运行gatk的教程

1.下载安装 wget https://github.com/broadinstitute/gatk/releases/download/4.1.8.1/gatk-4.1.8.1.zip2.解压 unzip *.zip3.查看 gatk --help 如下显示表示安装成功: 注意:仅限在该包所在位置的路径下能使用

使用Xilinx PCIE XDMA框架读写访问DDR3内容

在 FPGA 开发中,使用 XDMA(PCIe DMA)是实现主机和 FPGA 之间数据传输的常见方法。xdma_rw.exe 是一个官方提供的命令行工具,用于与 FPGA 进行读写操作,支持从 PCIe 总线读取或写入数据。我利用xdma框架实现了DDR3内存的…

【论文笔记之 Mega-TTS2】Boosting Prompting Mechanisms For Zero-Shot Speech Synthesis

本文对 Ziyue Jiang 等人于 2024 年发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载,但请务必注明出处。 论文链接:https://arxiv.org/pdf/2307.07218 目录 Abstract1. 介绍2. 背景3. 方法3.1. 解耦出韵律和音色3.2. 压缩…

haproxy+nginx负载均衡实验

准备三台虚拟机: HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器(192.168.65.131)上操作: 安装 HAProxy: sudo yum install -y haproxy编辑 HAProxy 配置…

[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…

华三交换机怎么进行链路聚合?

目录 准备:两台交换机 配置:进行交换机配置 完成:检查链路聚合是否成功 准备:两台交换机 1、进行连线 2、上行Core交换机都选取 Ten-GigabitEthernet1/0/51、Ten-GigabitEthernet1/0/52和 Ten-GigabitEthernet2/0/51、Ten-Giga…

【无线传感网】无线传感器网络覆盖技术

文章目录 覆盖算法设计思路及性能评价标准覆盖感知模型布尔感知模型概率感知模型 无线传感网络覆盖算法分类按照配置方式确定性覆盖随机性覆盖 根据覆盖目标面覆盖点覆盖栅栏覆盖 典型的WSN覆盖算法与协议基于网格的覆盖定位传感器配置算法圆周覆盖连通传感器覆盖轮换活跃/休眠…

积分图(Integral Image)与均值滤波的快速实现

积分图(Integral Image)也称为求和图(Summed Area Table),是一种用于快速计算图像中任意矩形区域像素值总和的技术。 基本概念 积分图的每个位置(i, j)存储的是从图像左上角(1, 1)到当前位置(i, j)所有像素值的累积和…

MySQL数据库笔记——多版本并发控制MVCC

大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍MySQL的并发控制:多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…

css3实现文字下滑波浪线

上效果 上菜 text-decoration 属性作用:用于设置或检索文本的装饰线,如下划线、上划线、删除线等 text-decoration: line || color || style; 参数: line: 指定装饰线类型,如 underline(下划线)、overline&…

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)

文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置(解决封装统一异常处理后doc.html无法打开的问题)4.创建Knif…

2024年中国新能源汽车用车发展怎么样 PaperGPT(一)

概述 在国家政策的强力扶持下,2024年中国新能源汽车市场迎来了新的发展机遇。本文将基于《中国新能源汽车用车报告(2024年)》的数据,对新能源汽车的市场发展和用车趋势概述。 新能源汽车市场发展 政策推动:国家和地…

华三交换机如何进行堆叠?

准备:两台交换机堆叠 1、进行连线 2、交换机都选取 FortyGigE1/0/53 和 FortyGigE1/0/54 做 堆叠口 配置:进行交换机配置 X_T1_Core_1: [X_T1_Core_1]irf domain 0 //同一拓扑内如果有其它堆叠组,domain不能重复 [X_T1_Core_1]…

活动预告 | Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动,了解如何更好地在 Microsoft 365 Defen…

Sonic:开源Go语言开发的高性能博客平台

Sonic:一个用Go语言开发的高性能博客平台 简介 Sonic,一个以其速度如声速般快速而命名的博客平台,是一个用Go语言开发的高性能博客系统。正如其名字所暗示的,Sonic旨在提供一个简单而强大的博客解决方案。这个项目受到了Halo项目…

大模型WebUI:Gradio全解系列8——Additional Features:补充特性(上)

大模型WebUI:Gradio全解系列8——Additional Features:补充特性(上) 前言本篇摘要8. Additional Features:补充特性8.1 队列8.1.1 使用方法8.1.2 配置队列演示 8.2 输入输出流8.2.1 输出流1. 生成器yield2. 流媒体 8.2…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件: 所以FFmpeg是怎样判断出某个文件是否为PS文件呢?它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…

【Leetcode】3280. 将日期转换为二进制表示

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个字符串 date,它的格式为 yyyy-mm-dd,表示一个公历日期。 date 可以重写为二进制表示,只需要将年、月、日分别转换为对应的二进制表示&a…

Spring实现输出带动态标签的日志

版权说明: 本文由博主keep丶原创,转载请保留此块内容在文首。 原文地址: https://blog.csdn.net/qq_38688267/article/details/144851857 文章目录 背景底层原理实现方案Tag缓存实现封装注解通过AOP实现日志缓存封装行为参数通用方法实现手动…