Python 实现PDF和TIFF图像之间的相互转换

news2024/11/22 15:54:51

PDF是数据文档管理领域常用格式之一,主要用于存储和共享包含文本、图像、表格、链接等的复杂文档。而TIFF(Tagged Image File Format)常见于图像处理领域,主要用于高质量的图像文件存储。 在实际应用中,我们可能有时需要将PDF文件转换为TIFF图像,或者将TIFF转换为PDF,以适应不同的场景需求。
本文将介绍如何使用Python实现PDF和TIFF格式之间的相互转换。

文章目录

      • 所需Python库
      • Python 将PDF文件转换为一个多页TIFF图像
      • Python 将TIFF图像转换为PDF文件

所需Python库

本文中需要用到以下两个Python库:

  • Spire.PDF Python - 支持在Python 程序中创建、读取、编辑、转换和保存 PDF 文档。
  • Pillow – Python的图像处理库(基于PIL库),提供了对图像的读取、修改、创建和保存等功能,支持多种图像格式,包括 JPEG、PNG、GIF、TIFF、BMP 等。

这两个Python库可以通过下面的pip 命令进行安装:

pip install Spire.Pdf
pip install pillow

Python 将PDF文件转换为一个多页TIFF图像

TIFF格式支持存储多页图像,非常适合用于存储和分发包含多个图像或页面的文档,如扫描的书籍、报纸或报告等。要将PDF文件转换为TIFF,我们需要使用Spire.PDF for Python库提供的接口将PDF中每一页转换为图像流,然后再使用Pillow 库将这些图像流合并为一个连续的多页TIFF 文件。

主要步骤及方法如下:

  1. 使用PdfDocument类的LoadFromFile()方法加载PDF文件;
  2. 将PDF页面转换为图像:
    • 遍历PDF文件中的每一页;
    • 使用PdfDocument类的SaveAsImage()方法将每一页转换为图像流;
    • 使用Pillow库将图像流转换为Image图像对象,并添加到列表中。
  3. 将列表中的图像保存为一个多页TIFF文件。

Python 代码:

from spire.pdf.common import *
from spire.pdf import *

from PIL import Image
from io import BytesIO

# 加载PDF文档
pdf = PdfDocument()
pdf.LoadFromFile("实验.pdf")

# 创建列表
images = []

# 遍历PDF文档中所有页面
for i in range(pdf.Pages.Count):

    # 将指定页面转换为图像流
    with pdf.SaveAsImage(i) as imageData:

        # 将图像流转换为图像对象
        img = Image.open(BytesIO(imageData.ToArray())) 

        # 将转换后的图像对象添加到列表中
        images.append(img)

# 使用第一个图像作为基底,然后将剩余的图像附加到这个基底上,形成一个连续的多页TIFF文件
images[0].save("PDF转TIFF.tiff", save_all=True, append_images=images[1:])

# 释放资源
pdf.Dispose()

生成TIFF文件:
PDF转TIFF长图

Python 将TIFF图像转换为PDF文件

如需将一个多页TIFF图像转换为PDF文档,需要首先借助Pillow库来拆分TIFF图像中的每一帧并保存为PNG图片,然后使用Spire.PDF for Python库将这些图片绘制到PDF页面上。

主要步骤及方法如下:

  1. 创建一个PdfDocument类的对象;
  2. 使用Pillow库的加载一个TIFF图像文件;
  3. 处理TIFF图像帧:
    • 遍历TIFF图像中的每个帧;
    • 获取当前帧,然后使用Pillow库提供的copy()方法复制当前帧。
    • 使用Pillow库提供的save()方法将当前帧保存为指定格式的图像文件。
    • 使用Spire.PDF库将图像文件转换为PDF图像对象。
  4. 将图像绘制到PDF页面上:
    • 使用PdfDocument.Pages.Add()方法在PDF文档中添加页面。
    • 使用PdfPageBase.Canvas.DrawImage()方法在PDF页面上绘制图像。
  5. 保存PDF文件。

Python 代码:

from spire.pdf.common import *
from spire.pdf import *

from PIL import Image
import io

# 创建PdfDocument对象
pdf = PdfDocument()

# 设置页边距
pdf.PageSettings.SetMargins(0.0)

# 加载TIFF图像
tiff_image = Image.open("PDF转TIFF.tiff")

# 遍历其中每一帧
for i in range(tiff_image.n_frames):

    # 获取当前帧
    tiff_image.seek(i)
    
    # 复制当前帧并保存为PNG图像文件
    tiff_image.copy().save("output_frame_{i}.png")
    
    # 将PNG图像文件转换为PDF图像对象
    image = PdfImage.FromFile("output_frame_{i}.png")

    # 获取图像宽度和高度
    width = image.PhysicalDimension.Width
    height = image.PhysicalDimension.Height

    # 在PDF中添加一个与图像大小相同的页面
    page = pdf.Pages.Add(SizeF(width, height))

    # 将图像绘制在页面指定位置处
    page.Canvas.DrawImage(image, 0.0, 0.0, width, height)

# 保存PDF文件
pdf.SaveToFile("Tiff转Pdf.pdf",FileFormat.PDF)

# 释放资源
pdf.Dispose()

生成PDF文件:
TIFF转PDF


  • 去除水印,点击自行申请一个月免费授权:
    https://www.e-iceblue.cn/misc/temporary-license.html

  • PDF转换功能示例:
    https://www.e-iceblue.cn/pdfforpython/spire-pdf-for-python-program-guide-content.html

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

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

相关文章

哪个邮箱最安全最好用啊

企业邮箱安全至关重要,需保护隐私、防财务损失、维护通信安全、避免纠纷,并维持业务连续性。哪个企业邮箱最安全好用呢?Zoho企业邮箱,采用加密技术、反垃圾邮件和病毒保护,支持多因素认证,确保数据安全合规…

php的文件上传

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

【每日刷题Day85】

【每日刷题Day85】 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 125. 验证回文串 - 力扣(LeetCode) 2. 43. 字符串相乘 - 力扣(L…

【es】elasticsearch 自定义排序-按关键字位置排序

一 背景 要求es查询的结果按关键字位置排序,位置越靠前优先级越高。 es版本7.14.0,项目是thrift,也可以平替springboot,使用easyes连接es。 二 easyes使用 配easyes按官方文档就差不多了 排序 | Easy-Es 主要的一个问题是easy…

FPGA深入浅出IP核学习(一)-- vivado中clk IP MMCM核的使用

FPGA深入浅出IP核学习系列文章主要是自己关于学习FGPA IP核的学习笔记,供大家参考学习指正。 目录 前言 一、MMCM-IP核简介 二、MMCM-IP核使用 1.IP核配置 2.模块程序设计 总结 前言 本文主要参考B站野火FGPA相关学习视频、正点原子达芬奇FPGA开发指南和赛灵思官方用…

一文入门SpringSecurity 5

目录 提示 Apache Shiro和Spring Security 认证和授权 RBAC Demo 环境 Controller 引入Spring Security 初探Security原理 认证授权图示​编辑 图中涉及的类和接口 流程总结 提示 Spring Security源码的接口名和方法名都很长,看源码的时候要见名知意&am…

docker笔记4-镜像理解

docker笔记4-镜像理解 一、镜像原理之联合文件系统二、镜像原理之分层理解三、commit镜像 一、镜像原理之联合文件系统 UnionFS(联合文件系统): Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持…

深入了解路由器工作原理:从零开始的简单讲解

简介 在现代网络中,路由器扮演着至关重要的角色。它不仅连接了不同的设备,还确保数据能够准确地传输到目的地。本文将带你深入探讨路由器的工作原理,帮助网络基础小白们理解这一重要设备的基本功能。 路由器的构成 路由器是一种具有多个输入…

云计算实训12——配置web服务器、配置客户端服务器、配置DNS服务、实现DNS域名解析

一、配置web服务器 准备操作 首先在正式配置之前需要做以下操作 关闭防火墙 systemctl stop firewalld 永久关闭防火墙 systemctl disable firewalld 关闭selinux setenforce 0 永久关闭selinux vim /etc/selinux/config selinuxpermissive 还需要保证能够正常ping通www.bai…

使用uniapp开发小程序(基础篇)

本文章只介绍微信小程序的开发流程,如果需要了解其他平台的开发的流程的话,后续根据情况更新相应的文章,也可以根据uniapp官网的链接了解不同平台的开发流程 HBuilderX使用:https://uniapp.dcloud.net.cn/quickstart-hx.html 开发工具 开始…

【Django】在vscode中运行调试Django项目(命令及图形方式)

文章目录 命令方式图形方式默认8000端口设置自定义端口 命令方式 python manage.py runserver图形方式 默认8000端口 设置自定义端口

LIS系统源码,实验室管理信息系统LIS,.Net C#语言开发,支持DB2,Oracle,MS SQLServer等主流数据库

实验室管理信息系统LIS源码,采用.Net C#语言开发,C/S架构。支持DB2,Oracle,MS SQLServer等主流数据库。(LIS系统全套商业源码,自主版权,多家大型综合医院应用案例,适合二次开发&…

【Android】ListView和RecyclerView知识总结

文章目录 ListView步骤适配器AdpterArrayAdapterSimpleAdapterBaseAdpter效率问题 RecyclerView具体实现不同布局形式的设置横向滚动瀑布流网格 点击事件 ListView ListView 是 Android 中的一种视图组件,用于显示可滚动的垂直列表。每个列表项都是一个视图对象&…

spring IOC DI --DI详解

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 文章目录 4.3 DI详解4.3.1属性注入4.3.2 构造方法注入4.3.3 Setter注入4.3.4 三种注入优缺点 4.4 Autowired 存在问题PrimaryQualifier 4.3 DI详解 依赖注入是一个过程,是指Ioc容器在创建Bean…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

C++:模板(函数模板,类模板)

目录 泛型编程 函数模板 函数模板格式 函数模板的原理 函数模板的实例化 类模板 类模板格式 类模板实例化 模板分为函数模板和类模板 在C中使用模板可以让我们实现泛型编程 泛型编程 如果我们需要实现一个加法add函数,那么会怎么实现呢? int…

AI学习记录 - 规范化输出对接现有系统的实例

假设我们有一个学生管理系统,通过prompt提示,格式化输出然后对接现有系统,也是通过react实现,因为这只是一个知识分享,没弄太复杂(使用react实现)。 学生管理系统 1、设计好prompt getMemory()…

大屏数据看板一般是用什么技术实现的?

我们看到过很多企业都会使用数据看板,那么大屏看板的真正意义是什么呢?难道只是为了好看?答案当然不仅仅是。 大屏看板不仅可以提升公司形象,还可以提升企业的管理层次。对于客户,体现公司实力和品牌形象,…

Linux shell编程学习笔记66:ping命令 超详细的选项说明

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容,Linux和基于Linux的操作系统,提供了很多的网络命令,今天我们研究最常用的ping命令。 1 ping命令 的功能、格式和选项说明 1.1 ping命令 的功能 简单来说, ping 命令 会…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释: Spring Boot Starter 是一种方便的依赖管理方式,它封装了特定功能或技术栈的所有必要依赖项和配置,使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…