Skip to content

MinerU 深度优化

本文档详细说明 NotebookLM2PPT 中 MinerU 深度优化功能的技术实现细节,适合技术人员参考。

🧠 核心原理

MinerU 优化功能通过解析 MinerU 生成的 JSON 文件,提取页面结构信息,对基础转换生成的 PPT 进行深度优化,提升排版质量、图片清晰度和文本准确性。

🔧 核心模块

文件: notebooklm2ppt/utils/ppt_refiner.py

主要函数:

python
def refine_ppt(tmp_image_dir, json_file, ppt_file, png_dir, png_files, final_out_ppt_file)

参数说明:

  • tmp_image_dir: 临时图片目录
  • json_file: MinerU 生成的 JSON 文件路径
  • ppt_file: 基础转换生成的 PPT 文件路径
  • png_dir: PDF 转换生成的 PNG 图片目录
  • png_files: PNG 文件列表
  • final_out_ppt_file: 最终输出的优化后 PPT 文件路径

📊 优化流程

1. 智能文本框筛选

问题: 基础转换可能会识别出无关的文本框

解决方案: 使用 IOU(交并比)算法评估文本框与 PDF 内容块的重叠程度

实现:

python
def compute_iou(boxA, boxB):
    # 计算两个矩形的交集面积
    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    interWidth = max(0, xB - xA)
    interHeight = max(0, yB - yA)
    interArea = interWidth * interHeight

    boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])
    boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])

    iou = interArea / float(boxAArea + boxBArea - interArea)
    return iou

筛选逻辑:

  • 计算每个文本框与 PDF 内容块的 IOU
  • 保留 IOU > 0.01 的文本框(相关性强)
  • 删除 IOU ≤ 0.01 的文本框(可能是无关元素)

2. 字体统一处理

问题: 基础转换生成的 PPT 中,文本框字体可能各不相同

解决方案: 统一所有文本框字体为"微软雅黑"

实现:

python
# 创建微软雅黑字体对象
newFont = TextFont("微软雅黑")

# 遍历文本框中的所有文本范围
for textRange in paragraph.TextRanges:
    textRange.LatinFont = newFont

3. 高质量图片替换

问题: 基础转换过程中图片可能被压缩或质量降低

解决方案: 从 MinerU JSON 提取原始高清图片并替换

实现:

python
def download_image(image_url, tmp_image_path):
    if os.path.exists(tmp_image_path):
        return  # 避免重复下载
    
    response = requests.get(image_url)
    with open(tmp_image_path, 'wb') as f:
        f.write(response.content)

# 替换 PPT 中的图片
image = slide.Shapes.AppendEmbedImageByPath(ShapeType.Rectangle, tmp_image_path, rect1)
image.Line.FillType = FillFormatType.none
image.ZOrderPosition = 0  # 设置图片在最底层

4. 智能背景处理

问题: 需要平衡纯色区域填充和复杂背景保留

解决方案: 基于边缘多样性和颜色差异的智能判断

实现:

python
# 计算边缘多样性
def compute_edge_diversity(image_cv, left, top, right, bottom):
    # 提取四条边缘并计算颜色标准差
    # ...
    return diversity

# 计算四点颜色差异
def compute_four_point_diff(image_cv, left, top, right, bottom):
    # 获取四个角的颜色并计算差异
    # ...
    return np.mean(diffs)

# 智能决策
if diversity < 10 and diff < 9:
    # 纯色区域,填充平均颜色
    cv2.rectangle(image_cv, (l, t), (r, b), fill_color, thickness=-1)
else:
    # 复杂背景,保留原背景
    image_cv[t:b, l:r] = old_bg_cv[t:b, l:r]

📈 完整工作流程

1. 数据准备

python
# 1. 加载 MinerU JSON
data = load_json(json_file)
pdf_info = data['pdf_info']

# 2. 根据页码筛选信息
indices = get_indices_from_png_names(png_files)
pdf_info = [pdf_info[i] for i in indices]

# 3. 计算缩放比例
pdf_w, _ = pdf_info[0]['page_size']
presentation = Presentation()
presentation.LoadFromFile(ppt_file)
ppt_H, ppt_W = presentation.SlideSize.Size.Height, presentation.SlideSize.Size.Width
ppt_scale = ppt_W / pdf_w

2. 逐页处理

python
for page_index, slide in enumerate(presentation.Slides):
    # 1. 智能文本框筛选和字体统一
    # 2. 高质量图片替换
    # 3. 智能背景处理

3. 保存结果

python
presentation.SaveToFile(final_out_ppt_file, FileFormat.Pptx2019)
print(f"优化完成! 输出文件: {final_out_ppt_file}")

# 清理 PPT
clean_ppt(final_out_ppt_file, final_out_ppt_file)

🔍 关键算法

IOU(交并比)算法

应用: 文本框筛选 原理: 计算两个矩形区域的重叠程度 阈值: 0.01(经过实验验证的合理阈值)

边缘多样性检测算法

应用: 背景处理 原理: 计算文本块边缘的颜色多样性 阈值: 10(边缘颜色变化小,认为是纯色区域)

四点颜色差异算法

应用: 背景处理 原理: 计算文本块四个角的颜色差异 阈值: 9(四个角颜色差异小,认为是纯色区域)

⚙️ 技术参数

参数默认值作用影响
IOU 阈值0.01文本框筛选影响文本框保留数量
边缘多样性阈值10背景处理影响纯色区域判断
四点差异阈值9背景处理影响复杂背景保留
图片缓存启用性能优化减少重复下载

🚀 性能优化

  1. 图片缓存: 已下载的图片会缓存到 tmp_image_dir,避免重复下载
  2. 并行处理: 支持并行处理多个页面,提升转换速度
  3. 内存管理: 处理完每页后及时释放临时变量,避免内存占用过高

🐛 故障排查

常见问题

问题可能原因解决方案
图片下载失败网络连接问题或 URL 无效检查网络连接,确认 JSON 中的图片 URL
文本框筛选不准确IOU 阈值不合适或 JSON 解析质量差调整 IOU 阈值,检查 JSON 质量
背景处理效果不理想阈值设置不合适调整边缘多样性和四点差异阈值
优化速度慢文档较大或网络速度慢分批处理,确保网络连接稳定

调试建议

  1. 启用调试模式: 设置环境变量 NOTEBOOKLM2PPT_DEBUG=1
  2. 检查 JSON 文件: 确认 JSON 文件格式正确,包含完整的页面信息
  3. 验证图片 URL: 手动访问 JSON 中的图片 URL,确认可访问
  4. 调整阈值: 根据实际情况调整算法阈值

📚 技术依赖

  • Spire.Presentation: 用于 PPT 操作和修改
  • NumPy: 用于数值计算和数组操作
  • OpenCV: 用于图像处理和分析
  • Requests: 用于下载 MinerU 图片
  • Pillow: 用于图像处理

🔗 相关文档

基于 MIT 许可证开源