夜雨聆风学习资料网

ARTICLE · 1306470

PDFium MuPDF PDFBox

PDFium MuPDF PDFBox

✅Windows11 三个库总说明

重点:它们都不是双击打开看图的PDF阅读器,是开发工具包。你的需求:扫描PDF → 导出图片 → 把绿色方框变白 → 合并回PDF✅首选顺序:MuPDF(PyMuPDF) > PDFium(pypdfium2) > PDFBox(不适合扫描件)Windows11安装Python之后,一条pip命令就能装好,非常方便。

前置准备(Windows11统一先做)

1. 安装Python官网:https://www.python.org/downloads/✅安装时一定要勾选:Add Python to PATH2. 按  Win+R  输入  cmd  打开命令提示符

一、MuPDF(PyMuPDF,最推荐给你!)

官网:https://mupdf.com/两种用法:①命令行mutool;②Python脚本(就是刚才给你的去绿框脚本)

方式1:Python(推荐,直接跑去绿框代码)

CMD输入安装:

bashpip install pymupdf opencv-python numpy

装好之后,直接用我刚才给你的  remove_green.py  脚本,一键处理扫描PDF去绿色方框。

方式2:独立命令行 mutool(不用Python)

1. 下载Windows发行包:https://mupdf.com/releases.html2. 下载Windows zip压缩包,解压,里面有  mutool.exe 3. 把这个exe所在文件夹加到系统PATH,或者直接在文件夹地址栏输入cmd4. 导出PDF全部页面为PNG(72DPI)

bashmutool draw -o page%d.png -r 72 软考.pdf

作用:直接批量导出图片,导出后你可以用PS/GIMP批量处理绿色。

优点

Windows兼容性最好、速度快、渲染扫描PDF质量高;既能命令行,又能Python写自动化脚本,完美匹配你的需求。

二、PDFium(谷歌Chromium的PDF引擎,渲染画质天花板)

官网:https://pdfium.googlesource.com/pdfium/原生是C库,普通人只用Python封装 pypdfium2CMD安装:

bashpip install pypdfium2

示例(PDF导出图片)

pythonimport pypdfium2 as pdfiumpdf = pdfium.PdfDocument("软考.pdf")for i in range(len(pdf)):    page = pdf[i]    img = page.render(scale=72/72).to_pil()    img.save(f"pdfium_page_{i+1}.png")

优点

Chrome浏览器内核,渲染图片最清晰;

缺点

没有独立命令行工具,必须写Python代码,不能像mutool那样一行命令直接跑。适合追求图片清晰度。

三、Apache PDFBox(Java库,❌不适合你的扫描件)

官网:https://pdfbox.apache.org/download.html

⚠️划重点:PDFBox擅长【矢量可选中文字PDF】提取文字、拆分、加水印;渲染图片扫描PDF效果很差,不要拿来处理你的软考扫描资料!

1. 先安装Java JDK(必须)2. 官网下载  pdfbox-app-x.x.x.jar (独立大包,不用配置项目)3. cmd直接运行jar包

bash

提取文字(只对矢量PDF生效,扫描PDF提取不出文字)

java -jar pdfbox-app-3.0.8.jar ExtractText 软考.pdf out.txt

PDF转图片(扫描件效果差,不推荐)

java -jar pdfbox-app-3.0.8.jar PDFToImage -dpi 72 软考.pdf

优点

Java生态,处理文字类PDF功能齐全;

缺点

需要装Java,速度慢,扫描图片PDF渲染拉胯,直接pass,不适合你去绿框需求。

Windows11最简使用方案(给你)

1. Windows11装Python,执行: pip install pymupdf opencv-python numpy 2. 新建文本文档,粘贴我给你的  remove_green.py  代码,保存,后缀改成  .py 3. 把你的扫描PDF和py脚本放同一个文件夹4. 在文件夹地址栏输入cmd,运行: python remove_green.py 5. 等待跑完,直接生成一份绿色方框全部变白的新PDF,直接打印,超级省墨!

横向对比(你的场景:扫描PDF去绿框)

库 Windows安装难度 有无命令行 扫描PDF渲染 适合你?MuPDF(PyMuPDF) ⭐简单 pip一键装 ✅mutool ⭐⭐⭐⭐ ✅首选PDFium(pypdfium2) ⭐简单 pip一键装 ❌无 ⭐⭐⭐⭐⭐ 画质更好备选PDFBox ⭐⭐⭐需要Java ✅jar命令 ⭐很差 ❌不推荐

小坑提醒

Windows文件名不要带中文空格,PDF尽量放在英文路径,比如  D:\pdf\ruankao.pdf ,避免代码报错。

要不要我把脚本再微调一份Windows专用版本,自动适配Windows文件路径?

Windows11 适配版脚本(PyMuPDF + OpenCV,扫描PDF一键去除绿色色块)

特点:自动适配Windows路径、增加中文路径容错、增加进度提示、出错提示更友好,适合你在家Windows电脑跑。保存文件: remove_green_win.py

pythonimport fitz

PyMuPDFimport cv2import numpy as npimport os

=====================【在这里修改】=====================

INPUT_PDF  = r"D:\pdf\ruankao.pdf"

你的PDF路径,r开头!OUTPUT_PDF = r"D:\pdf\ruankao_no_green.pdf"DPI = 72

HSV绿色区间,效果不对就微调

LOWER_GREEN = np.array([35, 40, 40])UPPER_GREEN = np.array([85, 255, 255])

======================================================

def remove_green_from_image(img_bgr):    hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)    mask = cv2.inRange(hsv, LOWER_GREEN, UPPER_GREEN)    kernel = np.ones((2, 2), np.uint8)    mask = cv2.dilate(mask, kernel, iterations=1)    img_bgr[mask > 0] = [255, 255, 255]    return img_bgr

def main():

检查输入文件是否存在    if not os.path.isfile(INPUT_PDF):        print(f"❌找不到文件:{INPUT_PDF}")        print("提示:路径用 r'' 包裹,路径分隔用 ")        return

try:    doc = fitz.open(INPUT_PDF)except Exception as e:    print(f”❌打开PDF失败:{e}”)    returnnew_doc = fitz.open()total_pages = len(doc)print(f”✅读取成功,一共 {total_pages} 页,开始处理...”)for page_idx, page in enumerate(doc):    print(f”正在处理:{page_idx+1} / {total_pages}”)    pix = page.get_pixmap(dpi=DPI)    img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)    if pix.n == 4:        img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)    elif pix.n == 3:        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)    img_clean = remove_green_from_image(img)    img_rgb = cv2.cvtColor(img_clean, cv2.COLOR_BGR2RGB)    new_page = new_doc.new_page(width=pix.w, height=pix.h)    new_page.insert_image(        new_page.rect,        stream=img_rgb.tobytes(),        pixmap=fitz.Pixmap(img_rgb)    )new_doc.save(OUTPUT_PDF)new_doc.close()doc.close()print(f”\n🎉全部完成!输出文件:{OUTPUT_PDF}”)

ifname== "main":    main()

Windows操作步骤

1. 安装Python(官网下载,勾选 Add Python to PATH)2. Win+R 输入  cmd ,打开命令提示符,执行安装命令:

cmdpip install pymupdf opencv-python numpy

如果pip慢,可以用国内源加速:

cmdpip install pymupdf opencv-python numpy -ihttps://pypi.tuna.tsinghua.edu.cn/simple

3. 新建文本文档,粘贴全部代码,另存为  remove_green_win.py ,编码选UTF-84. 修改脚本里这两行,改成你自己PDF的位置:

pythonINPUT_PDF  = r"D:\pdf\ruankao.pdf"OUTPUT_PDF = r"D:\pdf\ruankao_no_green.pdf"

小技巧:资源管理器找到你的PDF,地址栏复制路径,前面加 r ,路径里面 \ 保留。

5. 在CMD里运行:

cmdpython remove_green_win.py

调试方案(颜色不对的时候)

  • 绿色去不干净: LOWER_GREEN = np.array([30,30,30])
  • 黑色文字被误抹:缩小范围

pythonLOWER_GREEN = np.array([40, 60, 60])UPPER_GREEN = np.array([75, 255, 255])

  • 需要更清晰打印: DPI = 96

补充:mutool单独导出图片(不想跑脚本的时候用)

MuPDF官网下载Windows包,解压后,在文件夹cmd执行:

cmdmutool draw -o page%d.png -r 72 ruankao.pdf

如果你想要,我再给你一个单页预览调试脚本,用来先测试一页图片,调好颜色参数再跑整本PDF,避免整本跑完效果不满意。

单页调试脚本(先试一页,调好绿色参数再跑整本)

保存为  test_one_page.py

pythonimport fitzimport cv2import numpy as np

=====================改这里=====================

INPUT_PDF = r"D:\pdf\ruankao.pdf"TEST_PAGE_NO = 3

测试第几页,从1开始数DPI = 72LOWER_GREEN = np.array([35, 40, 40])UPPER_GREEN = np.array([85, 255, 255])

===============================================

def remove_green_from_image(img_bgr):    hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)    mask = cv2.inRange(hsv, LOWER_GREEN, UPPER_GREEN)    kernel = np.ones((2, 2), np.uint8)    mask = cv2.dilate(mask, kernel, iterations=1)    img_bgr[mask > 0] = [255, 255, 255]    return img_bgr, mask

def main():    doc = fitz.open(INPUT_PDF)    page = doc[TEST_PAGE_NO - 1]    pix = page.get_pixmap(dpi=DPI)

img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)if pix.n == 4:    img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)elif pix.n == 3:    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)img_clean, mask = remove_green_from_image(img)cv2.imwrite(”test_origin.png”, img)cv2.imwrite(”test_result.png”, img_clean)cv2.imwrite(”test_mask.png”, mask)doc.close()print(”✅已生成3张图片,在当前文件夹:”)print(”test_origin.png 原始页面”)print(”test_result.png 去掉绿色后的效果”)print(”test_mask.png 白色=被识别为绿色的区域”)

ifname== "main":    main()

使用方法

1. 修改  INPUT_PDF  和  TEST_PAGE_NO (选一页有绿色方框的页面)2. cmd运行:

cmdpython test_one_page.py

3. 打开三张图片看效果:

  • mask图里面白色区域就是脚本选中要变白的地方
  • 如果mask把黑色文字也盖住了 → HSV上下限调窄
  • 如果绿色方框还有残留、mask盖不全 → 扩大HSV范围

配套小提示

调好这一页参数之后,直接把  LOWER_GREEN / UPPER_GREEN  复制粘贴到  remove_green_win.py  里面,再跑批量脚本处理全部PDF。

如果你后面跑批量脚本遇到报错,把报错文字发给我,我帮你排错。

要不要我再给你一个一键灰度打印版本脚本?处理完直接生成灰度PDF,更省墨。

一句话前置重点
这三个都不是双击打开的PDF阅读器!是程序员用的开发库(SDK),没有GUI窗口,用来写代码处理PDF(扫描件转图片、改颜色、提取文字),适合你想做「批量去掉PDF绿色方框」这种自动化任务;普通办公直接用极光/WPS,不要碰这三个
银河麒麟内网:都需要外网下载包;内网离线环境很难装。
一、PDFium(谷歌Chromium内核的PDF引擎,渲染最强!适合扫描PDF转图片)
✅特点:C语言写的,Chrome浏览器内置的PDF引擎,渲染图片质量最好,最适合把扫描PDF一页页导出PNG(就是你现在干的活)
- 官网:https://pdfium.googlesource.com/pdfium/
- 原生是C库,直接用C开发门槛高;普通人首选Python封装:pypdfium2
Python快速上手(推荐)
外网机器:
bash    
pip install pypdfium2
示例代码:PDF导出页面图片(正好适配你的软考扫描件)
python    
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("软考.pdf")
n = len(pdf)
for idx in range(n):
    page = pdf[idx]
    # scale=72就是72DPI,省内存
    bitmap = page.render(scale=72/72)
    pil_img = bitmap.to_pil()
    pil_img.save(f"page_{idx+1}.png")
缺点:原生没有命令行工具,必须写代码;编译原生库非常麻烦。
二、MuPDF(轻量、自带命令行 mutool!麒麟上最好上手)
✅特点:C库,轻、速度快,自带mutool命令行工具!不用写代码就能直接跑,非常适合批量转换PDF、导出图片、提取文字,支持扫描PDF渲染 
- 官网:https://mupdf.com/
- 安装:
- Debian/麒麟桌面(能联网): sudo apt install mupdf-tools 
- Python封装叫 PyMuPDF(fitz): pip install pymupdf 
✅命令行直接用(不用写代码!重点)
bash    
# 把pdf所有页面导出png,72DPI
mutool draw -o page%d.png -r 72 软考.pdf
 mutool draw :渲染PDF为图片; mutool clean 修复PDF; mutool extract 提取图片
Python示例:
python    
import fitz
doc = fitz.open("软考.pdf")
for page in doc:
    pix = page.get_pixmap(dpi=72)
    pix.save(f"page{page.number}.png")
优点:有命令行,调试方便;缺点:复杂PDF渲染偶尔小瑕疵。
三、Apache PDFBox(Java库,只适合矢量PDF,扫描图片PDF别用它!)
✅特点:Apache开源,Java专属,主打【可选中文字的矢量PDF】:提取文字、合并拆分PDF、加签名、生成PDF表单;渲染扫描图片PDF很差,不适合你的扫描件去绿框需求 
- 官网:https://pdfbox.apache.org/
- 下载:官网下载  pdfbox-app-x.x.x.jar ,自带命令行工具,不需要配置Java项目
命令行(java直接跑jar包)
bash    
# 提取文字(只对矢量PDF有效!扫描件不行)
java -jar pdfbox-app-3.0.8.jar ExtractText 软考.pdf out.txt
# 矢量PDF转图片(扫描件效果差,不推荐你用)
java -jar pdfbox-app-3.0.8.jar PDFToImage -dpi 72 软考.pdf
Java代码示例:
java    
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
PDDocument doc = PDDocument.load(new File("test.pdf"));
String text = new PDFTextStripper().getText(doc);
doc.close();
⚠️大坑提醒:PDFBox不擅长图片扫描PDF渲染!你的软考资料是扫描图片PDF,优先MuPDF / PDFium,不要选PDFBox
横向对比(针对你的需求:扫描PDF、批量导出图片、后续改方框颜色)
库 语言 有无命令行 适合扫描PDF导出图片? 适合你的场景 
PDFium C(pypdfium2-python) ❌无 ⭐⭐⭐⭐⭐渲染最好 首选,追求图片质量 
MuPDF C(mutool + PyMuPDF) ✅mutool命令行 ⭐⭐⭐⭐ 最推荐新手,可命令行可代码 
PDFBox Java ✅jar命令行 ⭐很差(矢量PDF专用) ❌不适合你的扫描资料 
结合你银河麒麟内网情况总结
1. 如果能临时上外网:优先 MuPDF, mutool draw 一条命令直接批量导出PDF页面成PNG,导出之后再用GIMP批量处理绿色方框;
2. 如果打算写Python脚本自动一键完成【PDF导出图片→替换绿色→合并回PDF】:选 pypdfium2;
3. 如果完全内网断网:这三个都很难装,回到你现在的方案:极光PDF导出图片 + GIMP分批修图;
4. PDFBox直接pass,它处理扫描图片PDF能力弱,解决不了你的需求。
补充:你想实现「自动识别绿色方框替换白色」思路
用 MuPDF/PDFium 把PDF导出PNG → Python OpenCV识别绿色色块、替换像素 → 再转回PDF;这就是你之前想要的自动工具底层逻辑。
要不要我直接给你一份完整Python脚本:MuPDF导出PDF图片 + OpenCV自动把绿色方框改成白色?
⚠️说明:这个脚本适合 MuPDF(PyMuPDF)+OpenCV,作用:
1. 读取扫描PDF,批量导出每一页图片
2. 自动把图片里的绿色区域改成白色,保留黑色文字
3. 把处理完的图片重新合并成新PDF
✅适合你的软考扫描资料,去掉绿色方框,省墨打印
❗前提:能联网装依赖;纯内网麒麟电脑装不了包就跑不动。
⚠️只处理图片型扫描PDF;矢量文字PDF不适合这个脚本。
第一步:安装依赖(外网终端执行)
bash    
pip install pymupdf opencv-python numpy
第二步:完整脚本(直接复制保存为  remove_green.py )
python    
import fitz  # PyMuPDF
import cv2
import numpy as np
import os
# ===================== 在这里改你的参数 =====================
INPUT_PDF = "软考.pdf"        # 你的原始PDF文件名,放到同一个文件夹
OUTPUT_PDF = "软考_去绿框.pdf" # 输出处理后的新PDF
DPI = 72                      # 分辨率,72足够复习打印,更小更省内存
# 绿色范围(HSV),可以微调,适配不同深浅的绿
LOWER_GREEN = np.array([35, 40, 40])
UPPER_GREEN = np.array([85, 255, 255])
# ==========================================================
def remove_green_from_image(img_bgr):
    # BGR转HSV,方便按颜色筛选
    hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
    # 生成绿色掩码:绿色区域=255,其他=0
    mask = cv2.inRange(hsv, LOWER_GREEN, UPPER_GREEN)
    # 掩码膨胀一点,把绿色边缘一起吃掉(方框边缘)
    kernel = np.ones((2,2), np.uint8)
    mask = cv2.dilate(mask, kernel, iterations=1)
    # 绿色区域全部填充白色
    img_bgr[mask > 0] = [255, 255, 255]
    return img_bgr
def main():
    if not os.path.exists(INPUT_PDF):
        print(f"错误:找不到文件 {INPUT_PDF}")
        return
    doc = fitz.open(INPUT_PDF)
    new_doc = fitz.open()
    total_pages = len(doc)
    print(f"一共 {total_pages} 页,开始处理...")
    for page_idx, page in enumerate(doc):
        print(f"正在处理第 {page_idx+1}/{total_pages} 页")
        # 渲染页面为像素图
        pix = page.get_pixmap(dpi=DPI)
        # pix转opencv格式
        img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)
        if pix.n == 4:
            img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)
        elif pix.n == 3:
            img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
        # 核心:把绿色替换成白色
        img_clean = remove_green_from_image(img)
        # 转回RGB给fitz
        img_rgb = cv2.cvtColor(img_clean, cv2.COLOR_BGR2RGB)
        # 临时保存到内存图片,添加到新pdf
        new_page = new_doc.new_page(width=pix.w, height=pix.h)
        new_page.insert_image(new_page.rect, stream=img_rgb.tobytes(), pixmap=fitz.Pixmap(img_rgb))
    new_doc.save(OUTPUT_PDF)
    new_doc.close()
    doc.close()
    print(f"✅全部完成!输出文件:{OUTPUT_PDF}")
if __name__ == "__main__":
    main()
使用方法
1. 新建文件夹,把  remove_green.py  和你的PDF放在一起
2. 修改脚本里  INPUT_PDF = "软考.pdf"  改成你自己PDF的名字
3. 终端进入这个文件夹,运行:
bash    
python remove_green.py
4. 跑完之后,同目录生成  软考_去绿框.pdf ,里面绿色方框全部变白,直接灰度打印,超级省墨!
调参指南(重点!如果效果不对)
1. 绿色去不干净:
把  LOWER_GREEN = np.array([30,30,30])  调低一点,扩大绿色识别范围
2. 黑色文字被误删、发白:
缩小绿色区间,改成
python    
LOWER_GREEN = np.array([40, 60, 60])
UPPER_GREEN = np.array([75, 255, 255])
3. 想更清晰:DPI改成96(文件会变大)
局限性提前告诉你
1. 是按像素颜色识别,不是识别方框,和GIMP替换颜色原理一样;如果有文字是绿色,也会被变白
2. 内网麒麟不能pip安装包,这个脚本跑不了,只能继续极光+GIMP分批方案
3. 只适合扫描件图片PDF;如果是矢量PDF,直接用PDFBox处理文字,不需要这个
如果你需要,我再给你一个单独测试颜色的小脚本,用来先测试一页,调好绿色参数再跑整本PDF。

灰度+去绿框二合一脚本(Windows版)

作用:①绿色方框变白 ②整页转为灰度,打印超级省墨保存为  remove_green_gray_win.py

pythonimport fitz

PyMuPDFimport cv2import numpy as npimport os

=====================【在这里修改】=====================

INPUT_PDF  = r"D:\pdf\ruankao.pdf"OUTPUT_PDF = r"D:\pdf\ruankao_gray_no_green.pdf"DPI = 72

绿色HSV范围,先用调试脚本调好再复制过来

LOWER_GREEN = np.array([35, 40, 40])UPPER_GREEN = np.array([85, 255, 255])

======================================================

def process_image(img_bgr):

1. 先把绿色区域替换成白色    hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)    mask = cv2.inRange(hsv, LOWER_GREEN, UPPER_GREEN)    kernel = np.ones((2, 2), np.uint8)    mask = cv2.dilate(mask, kernel, iterations=1)    img_bgr[mask > 0] = [255, 255, 255]

# 2. 转为灰度图,再转回3通道(PDF需要RGB)gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)img_gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)return img_gray

def main():    if not os.path.isfile(INPUT_PDF):        print(f"❌找不到文件:{INPUT_PDF}")        return

try:    doc = fitz.open(INPUT_PDF)except Exception as e:    print(f”❌打开PDF失败:{e}”)    returnnew_doc = fitz.open()total_pages = len(doc)print(f”✅读取成功,一共 {total_pages} 页,开始处理...”)for page_idx, page in enumerate(doc):    print(f”正在处理:{page_idx+1} / {total_pages}”)    pix = page.get_pixmap(dpi=DPI)    img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)    if pix.n == 4:        img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)    elif pix.n == 3:        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)    img_clean = process_image(img)    img_rgb = cv2.cvtColor(img_clean, cv2.COLOR_BGR2RGB)    new_page = new_doc.new_page(width=pix.w, height=pix.h)    new_page.insert_image(        new_page.rect,        stream=img_rgb.tobytes(),        pixmap=fitz.Pixmap(img_rgb)    )new_doc.save(OUTPUT_PDF)new_doc.close()doc.close()print(f”\n🎉全部完成!灰度+去绿框文件:{OUTPUT_PDF}”)

ifname== "main":    main()

使用顺序建议(推荐流程)

1. 先用  test_one_page.py  挑一页有绿框的页面,调试HSV参数2. 把调好的  LOWER_GREEN / UPPER_GREEN  复制到这个灰度脚本3. 运行脚本,直接生成灰度、无绿色色块的PDF,直接打印

补充:

  • 如果文字太淡:可以在灰度步骤后面增加对比度,我可以再加对比度增强版本
  • 安装包还是这一条(和前面一样)

cmdpip install pymupdf opencv-python numpy -ihttps://pypi.tuna.tsinghua.edu.cn/simple

如果你后续想,我还可以给你加上【自动增强文字对比度】的版本,扫描件文字会更黑更清楚!

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料

暂无相关学习资料