最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python代碼實現PDF與TIFF互轉

 更新時間:2026年05月01日 07:42:24   作者:SunnyDays1011  
在本指南中,我們將深入探討如何借助Spire.PDF for Python和Pillow(PIL)庫的強大功能,在Python將PDF與TIFF這兩種格式進行互相轉換,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

在現代數字化環(huán)境中,能夠通過編程方式操作文檔格式是實現業(yè)務流程自動化的重要基礎。在法律、醫(yī)療和企業(yè)環(huán)境中,PDF(便攜式文檔格式)和TIFF(標記圖像文件格式)無疑是最常用的文檔存儲格式。

雖然PDF是共享和查看文檔的通用標準,但TIFF由于其無損特性以及支持將多個頁面(幀)合并成一個文件的優(yōu)勢,依然是高質量存檔、掃描和傳真處理的首選格式。在本指南中,我們將深入探討如何利用Python將這兩種格式進行互相轉換,借助Spire.PDF for Python和Pillow(PIL)庫的強大功能。

1. 為什么需要在PDF和TIFF之間轉換

在我們深入代碼之前,了解一下為什么會有這種技術需求是非常重要的。以下是一些典型的使用場景:

  • 長期存檔: 許多政府和法律機構要求使用TIFF格式進行長期存儲,因為TIFF是一種“未壓縮”的柵格格式,比起復雜的基于矢量的PDF格式,TIFF更不容易受到損壞。
  • 掃描工作流程: 文檔掃描儀通常輸出多頁TIFF文件。將這些文件轉換為PDF可以提高文件的壓縮率,并且可以添加OCR(光學字符識別)層,便于后期檢索。
  • 醫(yī)學成像: DICOM和其他醫(yī)學標準常常使用TIFF格式。將醫(yī)學報告轉換為PDF格式,能夠讓患者和醫(yī)生更容易訪問。
  • 安全性: 將PDF轉換為TIFF格式能夠“平面化”文檔,去除隱藏的元數據、注釋和不可見的文本層,這對快速進行信息遮蓋非常有效。

2. 設置Python開發(fā)環(huán)境

要跟隨本教程進行操作,首先需要安裝兩個主要的庫:

  • Spire.PDF for Python: 這是一個強大的庫,能夠創(chuàng)建、讀取和操作PDF文檔,并且無需依賴Adobe Acrobat。
  • Pillow(PIL): 這是Python Imaging Library的一個“友好”分支,廣泛用于打開、操作和保存多種圖像文件格式。

你可以通過pip命令安裝這些依賴:

pip install Spire.Pdf
pip install Pillow

3. 使用Python將PDF轉換為多頁TIFF

將PDF轉換為TIFF的挑戰(zhàn)在于如何保留其多頁結構。一般的圖像轉換方法可能只能提取第一頁,而我們需要遍歷整個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是創(chuàng)建多頁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"轉換過程中發(fā)生錯誤:{e}")
    finally:
        # 釋放資源以節(jié)省內存
        pdf_manager.Dispose()

# 執(zhí)行函數
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):
    # 創(chuàng)建一個新的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)
                
                # 將每一幀保存到一個臨時緩沖區(qū)
                frame_buffer = io.BytesIO()
                multi_frame_tiff.save(frame_buffer, format="PNG")
                frame_buffer.seek(0)
                
                # 將緩沖區(qū)中的圖像加載到PDF文檔中
                pdf_img = PdfImage.FromStream(frame_buffer)

                # 獲取圖像的寬高
                img_width = pdf_img.PhysicalDimension.Width
                img_height = pdf_img.PhysicalDimension.Height

                # 創(chuàng)建一個與圖像尺寸相同的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文件已成功創(chuàng)建:{output_pdf_path}")

    except Exception as e:
        print(f"處理TIFF時發(fā)生錯誤:{e}")
    finally:
        new_pdf.Dispose()

# 執(zhí)行函數
convert_tiff_to_pdf("Legacy_Records_Vol_1.tiff", "Digital_Library_V1.pdf")

5. 性能優(yōu)化與最佳實踐

處理1000頁以上的文檔時,簡單的腳本可能會達到內存限制。以下是一些性能優(yōu)化的建議:

內存管理

在PDF轉TIFF的過程中,我們將所有頁面的圖像存儲在一個列表(collected_images)中。對于500頁的PDF文件,這可能會消耗大量內存。

解決方法: 可以將每一頁圖像保存為單獨的TIFF文件,存放在臨時目錄中,然后使用Pillow逐一讀取這些文件進行處理,或者使用生成器模式,避免一次性將所有圖像加載到內存中。

分辨率與DPI(每英寸點數)

SaveAsImage方法通常允許指定DPI。對于普通的辦公文檔,300 DPI通常是一個合適的選擇,既保證了圖像清晰度,又避免了文件過大。對于需要存檔的法律文檔,600 DPI會更合適。

臨時文件處理

在轉換過程中,我使用了io.BytesIO代替將圖像保存為物理.png文件,這樣可以避免磁盤I/O的瓶頸,同時提高速度。

6. 高級擴展:添加水印

你可以在轉換過程中動態(tài)添加水印,增加腳本的附加值。因為我們已經遍歷了每一頁,可以在頁面上繪制文本或圖像。

# 動態(tài)添加水印的代碼
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 文件的互轉,有多種方案可選。我這里幫你梳理了幾個主流方法,包括輕量級方案、全能方案、商業(yè)庫和云服務,你可以根據項目需求(比如成本、復雜度、質量)來選擇。

快速概覽

下面是各種方案的對比表格,方便你快速了解它們的區(qū)別。

方案優(yōu)點缺點適用場景
pdf2image + Pillow輕量、方案成熟、社區(qū)活躍需安裝外部依賴(Poppler);以PIL為媒介,步驟稍多快速實現PDF轉TIFF,無需在純云端環(huán)境部署時
PyMuPDF (fitz) + Pillow無需額外系統依賴、純Python實現、高性能、API簡潔需兩步完成(PDF→PNG→TIFF)追求高性能和便捷部署的PDF處理場景
ImageConvert封裝完善、功能全面、API極簡相對較新,社區(qū)成熟度不及老牌庫希望用最簡潔代碼完成轉換的場景
Spire.PDF[^1] (商業(yè)庫)功能強大、轉換質量高、直接保存為TIFF商業(yè)庫,免費版有頁數/功能限制企業(yè)級應用,對轉換質量和穩(wěn)定性要求高
Aspose[^2] (商業(yè)庫)功能最全、轉換質量極高、專業(yè)文檔處理商業(yè)庫,價格昂貴對PDF處理功能有極致要求的大型企業(yè)項目
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 無損壓縮,可節(jié)省空間
    )
    print(f"轉換成功,文件已保存至: {tiff_path}")
# 使用示例
pdf_to_tiff("輸入.pdf", "輸出.tiff", dpi=300)

方法 2:PyMuPDF (fitz) + Pillow (強大高效)

這個方案很優(yōu)雅,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格式的圖像字節(jié)流
    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字節(jié)流
        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 是不錯的選擇。它封裝了底層細節(jié),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 (企業(yè)級方案)

對于追求穩(wěn)定和高質量的企業(yè)應用,可以考慮商業(yè)庫。

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 頁面上。除了下面幾種方法,上文提到的商業(yè)庫(如 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處理圖像幀,可以輕松創(chuàng)建既強大又易于維護的腳本。

無論是構建傳統的檔案管理系統,還是開發(fā)現代化的云端文檔處理系統,這些代碼示例都為你提供了堅實的基礎。記得在處理完資源后使用.Dispose()with語句來確保應用程序在高負載下的性能。

關鍵要點:

  • PDF轉TIFF: 遍歷頁面 > 渲染為圖像 > 使用save_all=True保存。
  • TIFF轉PDF: 遍歷幀 > 計算圖像尺寸 > 繪制到畫布。
  • 優(yōu)化: 使用BytesIO提高速度,使用LZW壓縮提高效率。

到此這篇關于Python代碼實現PDF與TIFF互轉的文章就介紹到這了,更多相關Python PDF與TIFF互轉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現五子棋游戲(pygame版)

    python實現五子棋游戲(pygame版)

    這篇文章主要為大家詳細介紹了python實現五子棋游戲,pygame版五子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • OpenCV凸包檢測和凸缺陷學習示例

    OpenCV凸包檢測和凸缺陷學習示例

    這篇文章主要為大家介紹了OpenCV凸包檢測和凸缺陷學習示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • CentOS 6.5中安裝Python 3.6.2的方法步驟

    CentOS 6.5中安裝Python 3.6.2的方法步驟

    centos 6.5默認自帶的python版本為2.6,而下面這篇文章主要給大家介紹了關于在CentOS 6.5中安裝Python 3.6.2的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12
  • python實現自動下載sftp文件

    python實現自動下載sftp文件

    這篇文章主要為大家詳細介紹了python實現自動下載sftp文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 從理論到實踐詳解Python構建一個健壯的流處理實時分析系統

    從理論到實踐詳解Python構建一個健壯的流處理實時分析系統

    流處理(Stream Processing) 就是專門為應對這種持續(xù)數據流而設計的一種計算范式,本文將深入探討如何使用Python構建一個健壯的流處理實時分析系統,涵蓋核心概念、技術選型、實現細節(jié)和最佳實踐,感興趣的小伙伴可以了解下
    2025-10-10
  • Matplotlib配色之Colormap詳解

    Matplotlib配色之Colormap詳解

    這篇文章主要介紹了Matplotlib配色之Colormap詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Python輕松實現2位小數隨機生成

    Python輕松實現2位小數隨機生成

    在Python中,我們經常需要生成隨機數,特別是2位小數的隨機數,這在模擬實驗、密碼學、游戲開發(fā)等領域都很有用,下面是如何在Python中生成2位小數的隨機數的代碼示例,需要的朋友可以參考下
    2023-11-11
  • python-numpy-指數分布實例詳解

    python-numpy-指數分布實例詳解

    今天小編就為大家分享一篇python-numpy-指數分布實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • PyCharm2020.1.1與Python3.7.7的安裝教程圖文詳解

    PyCharm2020.1.1與Python3.7.7的安裝教程圖文詳解

    這篇文章主要介紹了PyCharm2020.1.1與Python3.7.7的安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Python用61行代碼實現圖片像素化的示例代碼

    Python用61行代碼實現圖片像素化的示例代碼

    這篇文章主要介紹了Python用61行代碼實現圖片像素化的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12

最新評論

长子县| 冕宁县| 高陵县| 宕昌县| 固阳县| 乌兰察布市| 晋江市| 灵寿县| 个旧市| 黔西| 吉林市| 贵州省| 桓台县| 梨树县| 兴义市| 古丈县| 维西| 阳谷县| 绥棱县| 乡城县| 富川| 威海市| 高淳县| 苏尼特右旗| 子洲县| 阜南县| 东丽区| 沧州市| 镇平县| 建阳市| 柞水县| 库伦旗| 屏东市| 华宁县| 博白县| 察隅县| 巴林右旗| 朝阳市| 镇雄县| 五河县| 迭部县|