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")
关键修改说明
- 生成300DPI像素图:通过
page.get_pixmap(dpi=300)让fitz直接生成对应分辨率的像素图,从根源保证图像的像素密度符合要求,而非事后修改DPI标记。 - 转换为单色图像:先将RGB图像转为灰度图(
convert("L")),再通过阈值二值化转为1位黑白图,满足CCITT T.6压缩的格式要求。 - 优化保存参数:添加
save_all=True确保TIFF元数据正确写入,同时明确指定压缩和DPI参数。
内容的提问来源于stack exchange,提问作者Linux
相关产品推荐
相关产品推荐

