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文件夾的路徑 - 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 無損壓縮,可節(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
CentOS 6.5中安裝Python 3.6.2的方法步驟
centos 6.5默認自帶的python版本為2.6,而下面這篇文章主要給大家介紹了關于在CentOS 6.5中安裝Python 3.6.2的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-12-12
從理論到實踐詳解Python構建一個健壯的流處理實時分析系統
流處理(Stream Processing) 就是專門為應對這種持續(xù)數據流而設計的一種計算范式,本文將深入探討如何使用Python構建一個健壯的流處理實時分析系統,涵蓋核心概念、技術選型、實現細節(jié)和最佳實踐,感興趣的小伙伴可以了解下2025-10-10
PyCharm2020.1.1與Python3.7.7的安裝教程圖文詳解
這篇文章主要介紹了PyCharm2020.1.1與Python3.7.7的安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

