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

使用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,提问作者여름이

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:46:20