ARTICLE · 1306470
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,更省墨。
灰度+去绿框二合一脚本(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
如果你后续想,我还可以给你加上【自动增强文字对比度】的版本,扫描件文字会更黑更清楚!