如何使用Ghostscript等工具按条件过滤PDF图像仅保留最大背景图
Ghostscript原生的过滤参数仅支持全局移除/保留所有图像、文本、矢量对象,不支持按图像属性筛选,你可以通过以下两种方案实现需求:
方案1:基于pikepdf的Python实现(最灵活,完全匹配你的筛选规则)
可以自动识别符合「1bit二值、尺寸最大、体积最大」规则的图像,同时自动移除所有文本、矢量内容:
- 先安装依赖:
# Ubuntu sudo apt install python3-pip && pip3 install pikepdf pillow # Mac brew install python3 && pip3 install pikepdf pillow - 运行以下脚本即可:
import pikepdf from PIL import Image import io INPUT_PDF = "你的输入文件路径.pdf" OUTPUT_PDF = "你的输出文件路径.pdf" with pikepdf.open(INPUT_PDF) as pdf: for page in pdf.pages: # 先清空当前页所有原有内容 page.Contents = pikepdf.Array() max_score = 0 target = None # 遍历当前页所有图像 for img_name, raw_img in page.images.items(): img_data = raw_img.read_bytes() file_size = len(img_data) # 校验是否为1bit二值图 with Image.open(io.BytesIO(img_data)) as pil_img: if pil_img.mode != "1": continue # 按「尺寸优先级>体积优先级」计算评分 pixel_size = pil_img.width * pil_img.height current_score = pixel_size * 1000000 + file_size if current_score > max_score: max_score = current_score target = (img_name, raw_img, pil_img.width, pil_img.height) # 将符合要求的图像铺满页面 if target: _, raw_img, w, h = target page.Contents = pdf.make_stream(f"q\n1 0 0 1 0 0 cm\n/img {w} 0 0 {h} 0 0 cm\n/img Do\nQ") page.Resources.XObject = pikepdf.Dictionary({"/img": raw_img}) pdf.save(OUTPUT_PDF)
方案2:纯命令行实现(适合不想写代码的场景)
通过通用PDF工具组合实现筛选:
- 先安装依赖工具:
# Ubuntu sudo apt install poppler-utils imagemagick img2pdf # Mac brew install poppler imagemagick img2pdf - 导出PDF中所有嵌入图像:
pdfimages -all 输入文件.pdf ./tmp_extract_img - 查看所有导出图像的属性,筛选符合要求的图像:
输出结果中会标注每一张图的位深、像素尺寸、文件体积,手动挑出位深为identify ./tmp_extract_img*1-bit、像素尺寸最大、体积最大的图像,假设文件名为selected.tif - 将选中的图像转为PDF文件:
img2pdf selected.tif -o 输出文件.pdf
内容的提问来源于stack exchange,提问作者taiyodayo
相关产品推荐
相关产品推荐

