Python实现PDF与TIFF互转:从基础到多方案实战指南

山海之间
山海之间
发布时间:2026-10-12| 2人浏览过
原创

本文详解利用Python进行PDF与TIFF格式互转的多种实现路径。重点解析基于Spire.PDF for Python和Pillow库的核心代码,涵盖多页结构保留、LZW压缩及内存优化技巧。同时对比pdf2image、PyMuPDF、ImageConvert及img2pdf等方案,提供企业级与轻量级选择建议,帮助开发者构建高效文档处理系统。

在当前的数字化办公场景中,通过编程手段自动化处理文档格式已成为提升业务效率的关键环节。尤其在法律、医疗及大型企业领域,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的一个“友好”分支,Pillow被广泛用于打开、操作和保存多种图像文件格式。

你可以通过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 文件夹的路径
  • macOS: brew install poppler
  • Linux: sudo 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互转内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。