You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDF转TIFF:300DPI及CCITT T1.6压缩设置失效问题求助

解决PDF转TIFF时300DPI设置与CCITT T.6压缩失效问题

问题根源分析

  • CCITT T.6压缩不生效:该压缩格式仅支持1位黑白单色图像,你的代码生成的是RGB彩色图像,Pillow会自动忽略不兼容的压缩参数,导致压缩无效。
  • 300DPI设置无效:当前仅在保存时指定dpi参数,但fitz默认以72DPI(PDF标准默认分辨率)生成像素图,图像的像素尺寸与300DPI的物理尺寸要求不匹配,即使保存时标记DPI,实际输出的TIFF也达不到预期的分辨率规格。

修复后的代码

import os
from PIL import Image
import fitz

def pdf_to_tiffs(pdf_path, output_folder):
    # 创建输出目录(如果不存在)
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 打开PDF文件
    pdf_document = fitz.open(pdf_path)
    num_pages = len(pdf_document)
    num_digits = len(str(num_pages))

    for i in range(1, num_pages + 1):
        page = pdf_document[i - 1]
        # 直接生成300DPI的像素图,确保像素尺寸符合分辨率要求
        pix = page.get_pixmap(dpi=300)
        # 将pixmap转为Pillow图像
        img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
        
        # 转换为1位黑白单色图,满足CCITT T.6压缩要求
        # 先转灰度,再通过阈值二值化转为1位图像
        img_gray = img.convert("L")
        img_monochrome = img_gray.point(lambda x: 0 if x < 128 else 255, '1')

        # 生成带前导零的文件名
        filename = f"page_{str(i).zfill(num_digits)}.tif"
        tiff_path = os.path.join(output_folder, filename)
        
        # 保存TIFF,指定CCITT T.6压缩和300DPI
        img_monochrome.save(
            tiff_path,
            compression='tiff_ccitt',
            dpi=(300, 300),
            save_all=True
        )

    pdf_document.close()

# 示例调用
pdf_to_tiffs("C:\\Users\\ftp\\flask\\output\\90000026.pdf", "C:\\Users\\ftp\\flask\\output")

关键修改说明

  1. 生成300DPI像素图:通过page.get_pixmap(dpi=300)让fitz直接生成对应分辨率的像素图,从根源保证图像的像素密度符合要求,而非事后修改DPI标记。
  2. 转换为单色图像:先将RGB图像转为灰度图(convert("L")),再通过阈值二值化转为1位黑白图,满足CCITT T.6压缩的格式要求。
  3. 优化保存参数:添加save_all=True确保TIFF元数据正确写入,同时明确指定压缩和DPI参数。

内容的提问来源于stack exchange,提问作者Linux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:16:18