当前位置: 代码网 > it编程>前端脚本>Python > Python代码实现PDF与TIFF互转

Python代码实现PDF与TIFF互转

2026年05月01日 Python 我要评论
在现代数字化环境中,能够通过编程方式操作文档格式是实现业务流程自动化的重要基础。在法律、医疗和企业环境中,pdf(便携式文档格式)和tiff(标记图像文件格式)无疑是最常用的文档存储格式。虽然pdf是

在现代数字化环境中,能够通过编程方式操作文档格式是实现业务流程自动化的重要基础。在法律、医疗和企业环境中,pdf(便携式文档格式)和tiff(标记图像文件格式)无疑是最常用的文档存储格式。

虽然pdf是共享和查看文档的通用标准,但tiff由于其无损特性以及支持将多个页面(帧)合并成一个文件的优势,依然是高质量存档、扫描和传真处理的首选格式。在本指南中,我们将深入探讨如何利用python将这两种格式进行互相转换,借助spire.pdf for python和pillow(pil)库的强大功能。

1. 为什么需要在pdf和tiff之间转换

在我们深入代码之前,了解一下为什么会有这种技术需求是非常重要的。以下是一些典型的使用场景:

  • 长期存档: 许多政府和法律机构要求使用tiff格式进行长期存储,因为tiff是一种“未压缩”的栅格格式,比起复杂的基于矢量的pdf格式,tiff更不容易受到损坏。
  • 扫描工作流程: 文档扫描仪通常输出多页tiff文件。将这些文件转换为pdf可以提高文件的压缩率,并且可以添加ocr(光学字符识别)层,便于后期检索。
  • 医学成像: dicom和其他医学标准常常使用tiff格式。将医学报告转换为pdf格式,能够让患者和医生更容易访问。
  • 安全性: 将pdf转换为tiff格式能够“平面化”文档,去除隐藏的元数据、注释和不可见的文本层,这对快速进行信息遮盖非常有效。

2. 设置python开发环境

要跟随本教程进行操作,首先需要安装两个主要的库:

  • spire.pdf for python: 这是一个强大的库,能够创建、读取和操作pdf文档,并且无需依赖adobe acrobat。
  • pillow(pil): 这是python imaging library的一个“友好”分支,广泛用于打开、操作和保存多种图像文件格式。

你可以通过pip命令安装这些依赖:

pip install spire.pdf
pip install pillow

3. 使用python将pdf转换为多页tiff

将pdf转换为tiff的挑战在于如何保留其多页结构。一般的图像转换方法可能只能提取第一页,而我们需要遍历整个pdf文件的页面,将每一页渲染为高分辨率的栅格图像,然后将这些图像“堆叠”成一个tiff文件。

实现逻辑

我们通过pdfdocument加载pdf文件,然后使用saveasimage方法,这是一种将pdf矢量图像转换为位图图像的强大渲染方式。最后,pillow的save方法用于将这些图像按页保存为多帧tiff。

from spire.pdf.common import *
from spire.pdf import *
from pil import image
from io import bytesio

def convert_pdf_to_tiff(input_path, output_path):
    # 初始化pdf文档对象
    pdf_manager = pdfdocument()

    try:
        # 加载pdf文件
        pdf_manager.loadfromfile(input_path)

        # 存储每页图像的列表
        collected_images = []

        # 遍历pdf中的每一页
        for i in range(pdf_manager.pages.count):
            # 渲染页面为图像流
            with pdf_manager.saveasimage(i) as image_stream:
                # 将图像流转换为pil能理解的格式
                pil_img = image.open(bytesio(image_stream.toarray()))
                collected_images.append(pil_img)

        # 如果成功提取了图像
        if collected_images:
            # save_all=true是创建多页tiff的关键
            # append_images从第二页开始添加
            collected_images[0].save(
                output_path, 
                save_all=true, 
                append_images=collected_images[1:], 
                compression="tiff_lzw"  # lzw无损压缩,广泛支持
            )
            print(f"成功:{output_path}已生成,共包含{len(collected_images)}页。")

    except exception as e:
        print(f"转换过程中发生错误:{e}")
    finally:
        # 释放资源以节省内存
        pdf_manager.dispose()

# 执行函数
convert_pdf_to_tiff("annual_internal_audit.pdf", "audit_archive_fixed.tiff")

技术解析:压缩方式

在上面的代码中,我们使用了compression="tiff_lzw"。tiff格式支持几种不同的压缩算法:

  • 无压缩: 文件体积较大,但无质量损失。
  • lzw: 无损压缩,适合一般文档。
  • jpeg: 有损压缩,适合图片较多的文档,但不推荐用于文本。
  • packbits: 简单的rle压缩。

4. 使用python将多页tiff转换为pdf

从tiff转换回pdf实际上是一个“重新包装”的过程。我们将tiff的每一帧当做一张独立的图像,并将它们逐一插入到pdf的页面中。为了确保pdf的页面看起来合适,我们需要确保pdf页面的尺寸与图像的尺寸完全匹配。

实现逻辑

我们使用pillow打开tiff文件,并通过tiff.seek(i)遍历其中的每一帧。对于每一帧,我们计算图像的physicaldimension,确保pdf页面的尺寸适配图像。

from spire.pdf.common import *
from spire.pdf import *
from pil import image
import io
import os

def convert_tiff_to_pdf(input_tiff, output_pdf_path):
    # 创建一个新的pdf文档
    new_pdf = pdfdocument()

    # 设置页面边距为零,确保图像填充整个页面
    new_pdf.pagesettings.setmargins(0.0)

    try:
        # 打开tiff文件
        with image.open(input_tiff) as multi_frame_tiff:
            # 遍历tiff中的每一帧
            for i in range(multi_frame_tiff.n_frames):
                multi_frame_tiff.seek(i)
                
                # 将每一帧保存到一个临时缓冲区
                frame_buffer = io.bytesio()
                multi_frame_tiff.save(frame_buffer, format="png")
                frame_buffer.seek(0)
                
                # 将缓冲区中的图像加载到pdf文档中
                pdf_img = pdfimage.fromstream(frame_buffer)

                # 获取图像的宽高
                img_width = pdf_img.physicaldimension.width
                img_height = pdf_img.physicaldimension.height

                # 创建一个与图像尺寸相同的pdf页面
                pdf_page = new_pdf.pages.add(sizef(img_width, img_height))

                # 将图像绘制到pdf页面的画布上
                pdf_page.canvas.drawimage(pdf_img, 0.0, 0.0, img_width, img_height)

        # 保存pdf文件
        new_pdf.savetofile(output_pdf_path, fileformat.pdf)
        print(f"pdf文件已成功创建:{output_pdf_path}")

    except exception as e:
        print(f"处理tiff时发生错误:{e}")
    finally:
        new_pdf.dispose()

# 执行函数
convert_tiff_to_pdf("legacy_records_vol_1.tiff", "digital_library_v1.pdf")

5. 性能优化与最佳实践

处理1000页以上的文档时,简单的脚本可能会达到内存限制。以下是一些性能优化的建议:

内存管理

在pdf转tiff的过程中,我们将所有页面的图像存储在一个列表(collected_images)中。对于500页的pdf文件,这可能会消耗大量内存。

解决方法: 可以将每一页图像保存为单独的tiff文件,存放在临时目录中,然后使用pillow逐一读取这些文件进行处理,或者使用生成器模式,避免一次性将所有图像加载到内存中。

分辨率与dpi(每英寸点数)

saveasimage方法通常允许指定dpi。对于普通的办公文档,300 dpi通常是一个合适的选择,既保证了图像清晰度,又避免了文件过大。对于需要存档的法律文档,600 dpi会更合适。

临时文件处理

在转换过程中,我使用了io.bytesio代替将图像保存为物理.png文件,这样可以避免磁盘i/o的瓶颈,同时提高速度。

6. 高级扩展:添加水印

你可以在转换过程中动态添加水印,增加脚本的附加值。因为我们已经遍历了每一页,可以在页面上绘制文本或图像。

# 动态添加水印的代码
font = pdftruetypefont("arial", 20.0, pdffontstyle.bold, true)
brush = pdfbrushes.get_red()
pdf_page.canvas.settransparency(0.5)
pdf_page.canvas.drawstring("confidential - internal only", font, brush, 50, 50)

7.方法补充

想用 python 实现 pdf 和 tiff 文件的互转,有多种方案可选。我这里帮你梳理了几个主流方法,包括轻量级方案、全能方案、商业库和云服务,你可以根据项目需求(比如成本、复杂度、质量)来选择。

快速概览

下面是各种方案的对比表格,方便你快速了解它们的区别。

方案优点缺点适用场景
pdf2image + pillow轻量、方案成熟、社区活跃需安装外部依赖(poppler);以pil为媒介,步骤稍多快速实现pdf转tiff,无需在纯云端环境部署时
pymupdf (fitz) + pillow无需额外系统依赖、纯python实现、高性能、api简洁需两步完成(pdf→png→tiff)追求高性能和便捷部署的pdf处理场景
imageconvert封装完善、功能全面、api极简相对较新,社区成熟度不及老牌库希望用最简洁代码完成转换的场景
spire.pdf[^1] (商业库)功能强大、转换质量高、直接保存为tiff商业库,免费版有页数/功能限制企业级应用,对转换质量和稳定性要求高
aspose[^2] (商业库)功能最全、转换质量极高、专业文档处理商业库,价格昂贵对pdf处理功能有极致要求的大型企业项目
aspose cloud[^3] (云api)免维护、弹性扩展、支持复杂流程依赖网络,有延迟和成本;数据需上传外部无服务器架构、跨国团队协作或希望降低运维成本的项目

pdf 转 tiff:在 python 中把文档变成图片

方法 1:pdf2image + pillow (广泛使用)

这是最常用的方案之一,思路很清晰:先用 pdf2image 把pdf的每一页渲染成 pil 图像对象,再将这些图像合并保存为tiff。使用时需要先安装相关库和poppler工具。

1. 安装库和工具

pip install pdf2image pillow
  • windows: 下载 poppler for windows,解压后,在代码中通过 poppler_path 参数指定 bin 文件夹的路径
  • macosbrew install poppler
  • linuxsudo apt-get install poppler-utils

2. 编写转换代码

from pdf2image import convert_from_path
from pil import image
import os
def pdf_to_tiff(pdf_path, tiff_path, dpi=200):
    """
    将pdf转换为多页tiff
    """
    # 将pdf每一页转换为pil图像列表
    # windows用户需要添加 poppler_path 参数,例如:poppler_path=r'c:\path\to\poppler\bin'
    images = convert_from_path(pdf_path, dpi=dpi)
    if not images:
        print("pdf未产生任何图像,请检查文件。")
        return
    # 将第一张图像保存为tiff,并附加剩余图像
    images[0].save(
        tiff_path,
        save_all=true,
        append_images=images[1:],
        compression="tiff_lzw"  # 使用 lzw 无损压缩,可节省空间
    )
    print(f"转换成功,文件已保存至: {tiff_path}")
# 使用示例
pdf_to_tiff("输入.pdf", "输出.tiff", dpi=300)

方法 2:pymupdf (fitz) + pillow (强大高效)

这个方案很优雅,pymupdf 能将pdf页面直接渲染成 pil 图像,无需外部依赖,同时性能非常出色

1. 安装库

pip install pymupdf pillow

2. 编写转换代码

import fitz  # pymupdf
from pil import image
import io
def pdf_to_tiff_fitz(pdf_path, tiff_path, dpi=200):
    # 1. 打开pdf文档
    doc = fitz.open(pdf_path)
    images = []
    # 2. 遍历每一页,渲染为png格式的图像字节流
    for page_num in range(len(doc)):
        page = doc[page_num]
        # 设置缩放矩阵:dpi/72 为标准转换因子
        zoom = dpi / 72
        mat = fitz.matrix(zoom, zoom)
        pix = page.get_pixmap(matrix=mat)  # 渲染为像素图
        img_bytes = pix.tobytes("png")     # 转为png字节流
        img = image.open(io.bytesio(img_bytes))
        images.append(img)
    doc.close()
    # 3. 保存为多页tiff
    if images:
        images[0].save(
            tiff_path,
            save_all=true,
            append_images=images[1:],
            compression="tiff_lzw"
        )
        print(f"转换成功,文件已保存至: {tiff_path}")
# 使用示例
pdf_to_tiff_fitz("输入.pdf", "输出.tiff", dpi=300)

方法 3:imageconvert (下一代全能工具)

如果你想要一个更现代、全能的库,imageconvert 是不错的选择。它封装了底层细节,api 设计非常简洁。

1. 安装

pip install imageconvert

2. 编写转换代码

from imageconvert import imageconvert
# 调用库内置方法,一步完成转换
imageconvert.pdf_to_images("输入.pdf", "输出文件夹", dpi=300)

注意:imageconvert.pdf_to_images() 会将pdf每一页转为单独的图片,你可以用上文提到的 pillow 方法将它们合并成一个多页tiff。

方法 4:使用 spire.pdf / aspose.pdf (企业级方案)

对于追求稳定和高质量的企业应用,可以考虑商业库。

spire.pdf for python:可直接将pdf页面保存为图像流,再通过pillow合并为tiff

from spire.pdf import pdfdocument
from pil import image
from io import bytesio
doc = pdfdocument()
doc.loadfromfile("输入.pdf")
images = []
for i in range(doc.pages.count):
    with doc.saveasimage(i) as img_data:
        img = image.open(bytesio(img_data.toarray()))
        images.append(img)
if images:
    images[0].save("输出.tiff", save_all=true, append_images=images[1:])
doc.dispose()

aspose.pdf for python:提供了专门的 tiffdevice 类,可以精细控制tiff的压缩、分辨率等参数,并能直接输出为tiff

tiff 转 pdf:将零散图片汇成文档

从 tiff 转为 pdf 相对更直接,核心思路是把图片 “放” 到 pdf 页面上。除了下面几种方法,上文提到的商业库(如 spire.pdf、aspose.pdf)和云服务也能很好地实现 tiff 到 pdf 的转换。

方法 1:pillow (纯python,最简单)

pillow 库本身就能将多张图片直接保存为一个pdf文件

安装

pip install pillow

编写转换代码:多页tiff转单pdf

from pil import image
def tiff_to_pdf(tiff_path, pdf_path):
    # 打开一个多页tiff文件
    tiff_image = image.open(tiff_path)
    images = []
    # 遍历每一帧,将图像转换为rgb模式(pdf/a格式要求)
    for i in range(getattr(tiff_image, 'n_frames', 1)):
        tiff_image.seek(i)
        # 转换为rgb模式,避免透明度等兼容性问题
        rgb_image = tiff_image.convert("rgb")
        images.append(rgb_image)
    if images:
        # 将第一页保存为pdf,并附加其余页面
        images[0].save(pdf_path, save_all=true, append_images=images[1:])
        print(f"转换成功,pdf已保存至: {pdf_path}")
# 使用示例
tiff_to_pdf("输入.tiff", "输出.pdf")

方法2:img2pdf (无损转换,零压缩)

如果你追求极致的pdf质量和文件大小效率,img2pdf 是最佳选择。它直接将图像数据嵌入pdf,不进行二次编码,做到了真正的无损、零压缩-。

1. 安装

pip install img2pdf

2. 编写转换代码

import img2pdf
def tiff_to_pdf_img2pdf(tiff_path, pdf_path):
    # 直接读取文件并将tiff数据转换为pdf
    with open(pdf_path, "wb") as f:
        f.write(img2pdf.convert(tiff_path))
    print(f"转换成功,pdf已保存至: {pdf_path}")
# 使用示例
tiff_to_pdf_img2pdf("输入.tiff", "输出.pdf")

8. 总结

通过python实现pdf和tiff之间的自动化转换,为文档管理系统带来了极大的便利。使用spire.pdf处理pdf文件结构,使用pillow处理图像帧,可以轻松创建既强大又易于维护的脚本。

无论是构建传统的档案管理系统,还是开发现代化的云端文档处理系统,这些代码示例都为你提供了坚实的基础。记得在处理完资源后使用.dispose()with语句来确保应用程序在高负载下的性能。

关键要点:

  • pdf转tiff: 遍历页面 > 渲染为图像 > 使用save_all=true保存。
  • tiff转pdf: 遍历帧 > 计算图像尺寸 > 绘制到画布。
  • 优化: 使用bytesio提高速度,使用lzw压缩提高效率。

到此这篇关于python代码实现pdf与tiff互转的文章就介绍到这了,更多相关python pdf与tiff互转内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com