使用PyMuPDF提取PDF图片时背景变黑,如何保留透明背景?
解决PyMuPDF提取PDF透明背景图片变黑色的问题
问题原因
PDF中带透明背景的图片,大多通过**软掩码(SMask)**存储透明信息。你的原代码仅提取了图片主体数据,未处理SMask,导致透明区域被默认填充为黑色。
修复后的代码
import fitz # PyMuPDF import io import os from PIL import Image def extract_images_from_pdf(pdf_path, output_folder): doc = fitz.open(pdf_path) if not os.path.exists(output_folder): os.makedirs(output_folder) for page_number in range(len(doc)): page = doc[page_number] image_list = page.get_images(full=True) for img_index, img in enumerate(image_list): xref = img[0] base_image = doc.extract_image(xref) image_bytes = base_image["image"] # 获取软掩码(透明通道数据) smask_bytes = base_image.get("smask") real_image = Image.open(io.BytesIO(image_bytes)) # 合并软掩码作为Alpha通道 if smask_bytes: smask = Image.open(io.BytesIO(smask_bytes)) if real_image.size == smask.size: real_image = real_image.convert("RGBA") real_image.putalpha(smask) image_filename = f"page_{page_number + 1}_image_{img_index + 1}.png" image_path = os.path.join(output_folder, image_filename) real_image.save(image_path, format="PNG") doc.close() # 设置PDF路径和输出文件夹 pdf_path = "sample.pdf" output_folder = "extracted_images" extract_images_from_pdf(pdf_path, output_folder)
关键修复点
- 提取图片时同步获取
smask数据,这是PDF存储透明信息的核心载体 - 若存在SMask,将其转换为Alpha通道合并到原图,确保透明背景保留
- 保存时明确指定
format="PNG",保证透明通道被正确存储
额外注意事项
- 部分PDF的透明信息直接嵌入在图片RGBA通道中,原代码可正常处理,但SMask是PDF更通用的透明存储方式
- 若修复后仍有问题,需检查原PDF中图片本身是否包含有效透明信息,或是否为JPEG这类本身不支持透明的格式
内容的提问来源于stack exchange,提问作者여름이
相关产品推荐
相关产品推荐

