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

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.Widthheight = 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.mzph.cn/bicheng/49564.shtml

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

相关文章

wefwefwe

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

在 ArkTS 中集成 C 语言模块来管理文件描述符

文章目录 前言ArkTS模块C语言模块C模块代码 总结 前言 在现代开发中,尤其是在处理文件操作时,使用文件描述符(fd)是一种常见的方法。ArkTS提供了一种强大的方式来与底层C代码交互,使我们能够利用C语言的性能优势来管理…

LeetCode-day24-2766. 重新放置石块

LeetCode-day24-2766. 重新放置石块 题目描述示例示例1:示例2: 思路代码 题目描述 给你一个下标从 0 开始的整数数组 nums ,表示一些石块的初始位置。再给你两个长度 相等 下标从 0 开始的整数数组 moveFrom 和 moveTo 。 在 moveFrom.leng…

dsa加训

refs: OI Wiki - OI Wiki (oi-wiki.org) 1. 枚举 POJ 2811 熄灯问题 refs : OpenJudge - 2811:熄灯问题 如果要枚举每个灯开或者不开的情况,总计2^30种情况,显然T。 不过我们可以发现:若第i行的某个灯亮了,那么有且仅有第i行和第…

巧用 API 接口,尽览京东商品详情

在电商的浩瀚世界里,京东无疑是一座丰富的宝库,而京东商品详情则是其中的璀璨明珠。对于开发者、数据分析师和电商从业者来说,能够巧妙地运用 API 接口获取京东商品详情,无疑是打开了一扇洞察电商奥秘的窗户。 一、京东商品详情的…

【算法与数据结构】并查集

并查集 合并和查询集合的数据结构,经常用于连通图,最小生成树 K r u s k a l Kruskal Kruskal算法,最近公共祖先( L C A LCA LCA​​) 查询的时间复杂度:小于O( l o g 2 n log_{2}n log2​n)近乎O(1) 【模板】并查集 题目描述…

Win10使用VS Code远程连接Ubuntu服务器时遇到SSH公钥错误的解决方案

在使用Windows 10上的Visual Studio Code(VS Code)远程连接Ubuntu 20.04服务器时,遇到了以下错误: 错误的原因 这个错误消息表明,SSH 客户端检测到远程主机的 ECDSA 公钥已更改。可能是由于以下原因之一&#xff1a…

组蛋白乳酸化 | 调控蛋白Writers、Erasers和Readers

组蛋白修饰的调控可以被归类为三类蛋白:Writers(写入者)、Erasers(擦除者)和Readers(读取者)。Writers是负责在组蛋白上添加修饰基团的蛋白,包括乙酰化、甲基化等修饰。Erasers则是负…

学习记录——day17 数据结构 队列 链式队列

队列介绍 1、队列也是操作受限的线性表:所有操作只能在端点处进行,其删除和插入必须在不同端进行 2、允许插入操作的一端称为队尾,允许删除操作的一端称为队头 3、特点:先进先出(FIFO) 4、分类: 顺序存储的栈称为顺序栈 链式存储的队列&a…

如何使用js 判断在pc打开还是手机

在JavaScript中,你可以通过检查浏览器的userAgent字符串来判断用户是在PC(桌面设备)上打开页面还是在手机上(移动设备)打开。不过,需要注意的是,userAgent字符串可以被用户或浏览器插件修改&…

IP数据报结构详解:从基础到进阶

目录 IP数据报的格式 IP数据报首部的固定部分 IP数据报首部的可变部分 实例分析:数据报的分片 生存时间(TTL)与协议 首部检验和 总结 在网络通信中,IP数据报是至关重要的基本单元。本文将带您深入了解IP数据报的格式及其各个…

【Python】使用抓包Fiddler软件,网络查询 遇到“您的连接不是私密连接”的问题的解决方法

使用Fiddler抓包软件很久,忽然发现网络使用有问题,一点开浏览器就会出现类似下面的页面: 检查了网络情况发现不是网络的问题,也排除了封号的可能。发现只要把抓包软件Fiddler关闭以后就没问题了,就知道问题是出在软件…

国产光电耦合器2024年的机遇与挑战

随着科技的飞速发展,2024年对于国产光电耦合器行业来说,无疑是充满机遇与挑战的一年。本文将深入探讨该行业在技术创新、市场竞争、5G时代、新兴应用领域和国际市场拓展方面的现状及未来前景。 技术创新的黄金期 物联网和人工智能技术的迅猛发展&#x…

Java之集合底层-数据结构

Java集合之数据结构 1 概述 数据结构是计算机科学中研究数据组织、存储和操作的一门学科。它涉及了如何组织和存储数据以及如何设计和实现不同的数据操作算法和技术。常见的据结构有线性数据结构(含数组、链表、栈和队列等),非线性数据结构…

医学多模态:多模态知识增强全幻灯病理基础模型

A Multimodal Knowledge-enhanced Whole-slide Pathology Foundation Model 目录 摘要介绍结果2.1 mSTAR概述2.2 病理幻灯片分类用于诊断和治疗mSTAR改善了幻灯片级诊断任务mSTAR改善了分子预测2.3 病理生存分析预测mSTAR 提高了癌症生存预测2.4 多模态能力mSTAR促进多模态融合…

睿考网:中级会计师考试各科分值是多少?

中级会计考试是会计领域的一个重要考核,考试题型包含多种:单选题、多选题、判断题、计算分析题和综合题。这些不同的题型不仅覆盖了广泛的知识点,而且各自的评分标准也是不一样的。为了帮助大家更全面地掌握各类题型的得分规则,睿…

解决:Nacos无法获取远程配置数据,导致项目启动各种配置异常

解决:Nacos无法获取远程配置数据,导致项目启动各种配置异常 一问题描述:1.项目pom依赖版本:2.bootstrap.yml配置信息3.远程配置:默认public命名空间4.启动报异常,显示没有配置数据源,实际远程已…

Mysql随记

对表mysql.user执行DML语句(数据操作语言),那么此时磁盘数据较新,需要手动执行flush privileges 语句来覆盖内存中的授权数据。其他的DDL(数据操作语言),DQL(数据查询语言),DCL(数据…

韦东山嵌入式linux系列-查询方式的按键驱动程序_编写框架

1 LED 驱动回顾 对于 LED, APP 调用 open 函数导致驱动程序的 led_open 函数被调用。在里面,把 GPIO 配置为输出引脚。安装驱动程序后并不意味着会使用对应的硬件,而 APP 要使用对应的硬件,必须先调用 open 函数。所以建议在驱动…

【Pytorch】cumsum的实现逻辑

本文只记录cumsum的实现逻辑的CUDA部分,也即底层调用了CUDA的什么实现算子。 void launch_cumsum_cuda_kernel(const TensorBase& result, const TensorBase& self, int64_t dim) {AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND2(ScalarType::Half, ScalarType::…