Python简单使用MinerU

news/2025/2/23 6:59:49

Python简单使用MinerU

1 简介

MinerU是国产的一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。目前支持图像(.jpg及.png)、PDF、Word(.doc及.docx)、以及PowerPoint(.ppt及.pptx)等。

# 官网地址
https://mineru.readthedocs.io/en/latest/index.html

# Github地址
https://github.com/opendatalab/mineru

# API接口地址
https://mineru.readthedocs.io/en/latest/user_guide/quick_start/convert_pdf.html

# 模型下载脚本地址
# 从ModelScope下载模型:download_models.py
# 从HuggingFace下载模型: download_models_hf.py
https://github.com/opendatalab/MinerU/tree/master/scripts

2 安装MinerU

安装Python环境

# 我的版本是:magic-pdf==1.1.0
pip install -U "magic-pdf[full]" -i https://pypi.tuna.tsinghua.edu.cn/simple

下载权重

官网提供了HuggingFace和ModelScope两种方法下载,本文从ModlScope上下载,

# 官网下载方法地址
https://github.com/opendatalab/MinerU/blob/master/docs/how_to_download_models_zh_cn.md

开始下载权重

⚠️ 注意:模型下载完成后,脚本会自动生成用户目录下的magic-pdf.json文件,并自动配置默认模型路径。 您可在【用户目录】下找到magic-pdf.json文件。

# 安装modelscope
pip install modelscope

# 下载文件
wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/scripts/download_models.py -O download_models.py
# 也可以到下面的地址,找到download_models.py下载
https://github.com/opendatalab/MinerU/tree/master/scripts

# 执行下载模型
# 为了方便使用模型,我修改了download_models.py,添加了设置模型的位置。
python download_models.py

修改后的download_models.py

⚠️ 此步可以不做。

文件中的local_dir是我新加的下载模型的位置,如果不设置会下载到下面目录中:windows的用户目录为 “C:\Users\用户名”, linux用户目录为 “/home/用户名”。

import json
import os

import requests
from modelscope import snapshot_download


def download_json(url):
    # 下载JSON文件
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
    return response.json()


def download_and_modify_json(url, local_filename, modifications):
    if os.path.exists(local_filename):
        data = json.load(open(local_filename))
        config_version = data.get('config_version', '0.0.0')
        if config_version < '1.1.1':
            data = download_json(url)
    else:
        data = download_json(url)

    # 修改内容
    for key, value in modifications.items():
        data[key] = value

    # 保存修改后的内容
    with open(local_filename, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)


if __name__ == '__main__':
    mineru_patterns = [
        "models/Layout/LayoutLMv3/*",
        "models/Layout/YOLO/*",
        "models/MFD/YOLO/*",
        "models/MFR/unimernet_small_2501/*",
        "models/TabRec/TableMaster/*",
        "models/TabRec/StructEqTable/*",
    ]

    # 设置模型下载的位置
    local_dir="E:/mineru"

    # 下载模型
    model_dir = snapshot_download('opendatalab/PDF-Extract-Kit-1.0', allow_patterns=mineru_patterns, local_dir=local_dir)
    layoutreader_model_dir = snapshot_download('ppaanngggg/layoutreader', local_dir=local_dir)
    model_dir = model_dir + '/models'
    print(f'model_dir is: {model_dir}')
    print(f'layoutreader_model_dir is: {layoutreader_model_dir}')

    json_url = 'https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/magic-pdf.template.json'
    config_file_name = 'magic-pdf.json'
    home_dir = os.path.expanduser('~')
    config_file = os.path.join(home_dir, config_file_name)

    json_mods = {
        'models-dir': model_dir,
        'layoutreader-model-dir': layoutreader_model_dir,
    }

    download_and_modify_json(json_url, config_file, json_mods)
    print(f'The configuration file has been configured successfully, the path is: {config_file}')

3 Python使用MinerU

Python安装完MinerU后,可以直接执行下面的代码,首次执行时会自动下载PaddleOCR模型的权重和参数,PaddleOCR模型会自动下载到用户目录下的.paddleocr目录下。

解析PDF文件的Python代码如下:

python">import os

from magic_pdf.data.data_reader_writer import FileBasedDataWriter, FileBasedDataReader
from magic_pdf.data.dataset import PymuDocDataset
from magic_pdf.model.doc_analyze_by_custom_model import doc_analyze
from magic_pdf.config.enums import SupportedPdfParseMethod

# pdf文件路径
pdf_file_path = "E:/hello/test-5-2.pdf"
# 获取没有后缀的pdf文件名称
pdf_file_path_without_suff = pdf_file_path.split(".")[0]
print(pdf_file_path_without_suff)

# 文件所在的目录
pdf_file_path_parent_dir = os.path.dirname(pdf_file_path)
image_dir = os.path.join(pdf_file_path_parent_dir, "images")
print(image_dir)

# Markdown的写入实例
# markdown_dir = "./output/markdown"
# writer_markdown = FileBasedDataWriter(markdown_dir)
writer_markdown = FileBasedDataWriter()
# 读取图片
writer_image = FileBasedDataWriter(image_dir)

# 读取文件流
reader_pdf = FileBasedDataReader("")
bytes_pdf = reader_pdf.read(pdf_file_path)

# 处理数据
dataset_pdf = PymuDocDataset(bytes_pdf)

# 判断是否支持ocr
if dataset_pdf.classify() == SupportedPdfParseMethod.OCR:
    # 支持OCR
    infer_result = dataset_pdf.apply(doc_analyze, ocr=True)
    pipe_result = infer_result.pipe_ocr_mode(writer_image)
else:
    # 不支持OCR
    infer_result = dataset_pdf.apply(doc_analyze, ocr=False)
    pipe_result = infer_result.pipe_txt_mode(writer_image)

# 在每一页上都使用模型解析文本
infer_result.draw_model(pdf_file_path)

# 获取模型处理后的结果
model_inference_result = infer_result.get_infer_res()
print(model_inference_result)

# 为pdf生成含有颜色标注布局的pdf文件
pipe_result.draw_layout(f"{pdf_file_path_without_suff}_layout.pdf")

# 为pdf生成含有颜色标注文本行的pdf文件
pipe_result.draw_span(f"{pdf_file_path_without_suff}_spans.pdf")

# 获取markdown的内容
markdown_content = pipe_result.get_markdown(image_dir)
print(markdown_content)

# 保存markdown文件
# pipe_result.dump_md(writer_markdown, f"{pdf_file_path_without_suff}.md", image_dir)
pipe_result.dump_md(writer_markdown, f"{pdf_file_path_without_suff}.md", image_dir)

# json文本列表
# 数据类型包括type、text、text_level、page_idx、img_path等
content_list_content = pipe_result.get_content_list(image_dir)
print(content_list_content)

# 保存json文本列表
pipe_result.dump_content_list(writer_markdown, f"{pdf_file_path_without_suff}_content_list.json", image_dir)

# 获取含有位置信息的json文本
middle_json_content = pipe_result.get_middle_json()

# 保存含有位置信息的json文本
pipe_result.dump_middle_json(writer_markdown, f'{pdf_file_path_without_suff}_middle.json')

http://www.niftyadmin.cn/n/5863160.html

相关文章

C++STL容器之set

1.介绍 set容器是C标准模板库&#xff08;STL&#xff09;中的一个关联容器&#xff0c;用于存储唯一的元素。set中的元素是自动排序的&#xff0c;不允许重复。set通常基于红黑树&#xff08;一种自平衡二叉查找树&#xff09;实现&#xff0c;因此插入、删除和查找操作的时间…

C# 将非托管Dll嵌入exe中(一种实现方法)

一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Microsoft Visual Studio Professional 2022 (64 位) - Current 版本 17.11.4 其他: 二、测试目的 将基于C++创建DLL库,封装到C#生成的exe中。 一般C++创建的库,在C#中使用,都是采用DllImport导入的,且要求库处…

[特殊字符] 蓝桥杯 Java B 组 之位运算(异或性质、二进制操作)

Day 6&#xff1a;位运算&#xff08;异或性质、二进制操作&#xff09; &#x1f4d6; 一、位运算简介 位运算是计算机底层优化的重要手段&#xff0c;利用二进制操作可以大大提高运算速度。常见的位运算包括&#xff1a; 与&#xff08;&&#xff09;&#xff1a;a &am…

从《黑神话:悟空》看UE5云渲染的爆发力--渲染101云渲染

一、从《黑神话&#xff1a;悟空》看UE5云渲染的爆发力 2024年8月&#xff0c;《黑神话&#xff1a;悟空》凭借UE5的Nanite几何微多边形技术与Lumen全局光照系统&#xff0c;实现了毛发纹理精度达百万级、动态光影实时交互的视觉突破。这款国产3A大作的成功&#xff0c;印证了…

代码随想录_回溯

代码随想录_回溯 回溯 77.组合 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路: 回溯 优化: 剪枝 注意代码中i&#xff0c;就是for循环里选择的起始位置。 for (int i startIndex; i <…

安全面试2

文章目录 简单描述一下什么是水平越权&#xff0c;什么是垂直越权&#xff0c;我要发现这两类漏洞&#xff0c;那我代码审计要注意什么地方水平越权&#xff1a;垂直越权&#xff1a;水平越权漏洞的审计重点垂直越权漏洞的审计重点 解释一下ssrf漏洞原理攻击场景修复方法 横向移…

VUE四:Vue-cli

什么是Vue-cli vue-cli是官方提供的一个脚手架,用于快速生成一个vue的项目模板; 预先定义好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架,我们的开发更加的快速; 什么是web pack 本质上&#…

网页制作06-html,css,javascript初认识のhtml如何建立超链接

超链接有外部链接、电子邮件链接、锚点链接、空链接、脚本链接 一、内部链接 与自身网站页面有关的链接被称为内部链接 1、创建内部链接 1&#xff09;语法&#xff1a; <a href"链接地址"> …… </a> 2&#xff09;举例应用&#xff1a; 3&#xf…