简介

MinerU是一个"智能PDF阅读器"

它能帮你:

  • 📖 把PDF文档变成电脑能懂的格式

  • 📊 自动提取表格、公式、图片

  • 🔍 支持多种语言(中文、英文、日文等)

  • 🚀 处理速度很快,准确率很高

调用方式

网页端使用

本地代码🔗云服务

  • 到Mineru官网创建token,代码使用到(官网:mineru.net)
  • 上传pdf到mineru服务方法
  • 获取mineru转换之后文件,返回文件地址,根据地址下载文件
    # 定义函数:使用 Mineru API 上传文件
    def mineru_upload_file_demo():
        # 1. 导入需要的库
        import requests  # 发送 HTTP 请求
    
        # 2. 从环境变量读取 Mineru 的 Token(身份认证)
        token = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQg"
    
        # 3. Mineru 官方接口地址:申请文件上传的预签名 URL
        url = "https://mineru.net/api/v4/file-urls/batch"
    
        # 4. 请求头:携带 Token 认证 + JSON 格式
        header = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {token}"  # 身份凭证
        }
    
        # 5. 上传参数:文件名、自定义ID、使用的模型版本
        data = {
            "files": [
                {"name": "demo.pdf", "data_id": "abcd"}  # 文件名 + 自定义ID
            ],
            "model_version": "vlm"  # 模型版本:vlm = 多模态解析
        }
    
        # 6. 本地要上传的 PDF 文件路径
        file_path = ["./sample.pdf"]
    
        # 7. 异常捕获:防止网络/权限错误导致崩溃
        try:
            # 第一步:请求上传地址
            response = requests.post(url, headers=header, json=data)
    
            # 判断请求是否成功
            if response.status_code == 200:
                result = response.json()  # 转成 JSON
                print('上传成功:{}'.format(result))
    
                # 从返回结果中拿到 batch_id
                batch_id = result['data']['batch_id']
    
                # 判断接口返回码是否为 0(成功)
                if result["code"] == 0:
                    batch_id = result["data"]["batch_id"]
                    urls = result["data"]["file_urls"]  # 拿到上传用的 URL
                    print('batch_id:{},urls:{}'.format(batch_id, urls))
    
                    # 第二步:上传文件到 URL
                    for i in range(0, len(urls)):
                        with open(file_path[i], 'rb') as f:  # 以二进制读文件
                            # PUT 方式上传
                            res_upload = requests.put(urls[i], data=f)
    
                            if res_upload.status_code == 200:
                                print(f"{urls[i]} 上传成功")
                            else:
                                print(f"{urls[i]} 上传失败")
                else:
                    # 接口返回失败
                    print('apply upload url failed,reason:{}'.format(result.msg))
                return batch_id
            else:
                # HTTP 请求失败
                print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}")
        except Exception as err:
            # 捕获所有异常
            print(err)
    
    # batch_id = mineru_upload_file_demo()
    # print(batch_id)
    
    # 定义函数:根据 batch_id 查询 Mineru 文档解析结果
    def mineru_check_result_demo(batch_id):
        # 导入依赖库
        import requests  # 发送网络请求
        import time  # 用于等待、延时
    
        # 1. 从环境变量获取 Mineru 的身份令牌(必须)
        token = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQg"
    
        # 2. 拼接查询结果的 API 地址,把 batch_id 填进去
        url = f"https://mineru.net/api/v4/extract-results/batch/{batch_id}"
    
        # 3. 请求头:身份认证 + JSON格式
        header = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {token}"  # 身份凭证
        }
    
        # 4. 第一次发送请求,查询状态
        res = requests.get(url, headers=header)
    
        # 5. 循环检查:如果状态不是 done(完成),就一直等
        while res.json()["data"]['extract_result'][0]['state'] != 'done':
            # 打印提示:正在解析中
            print('当前状态为 running,等待3秒后重试')
    
            # 等待 3 秒再查
            time.sleep(3)
    
            # 再次查询接口
            res = requests.get(url, headers=header)
    
            # 打印状态信息,方便看进度
            print(res.status_code)
            print(res.json()["data"]['extract_result'][0]['state'], end="\n\n=========\n\n")
    
        # 6. 跳出循环 = 解析完成!
        print('提取结果为:', res.json()["data"]['extract_result'][0]['full_zip_url'])
    
    mineru_check_result_demo("62310441-149e-41c9-b956-8896b46ed28d")

    本地部署使用(推荐)

本地部署参考博客:

import json
import os
import subprocess
from pathlib import Path
from typing import Tuple


# 方法2:使用MinerU工具把pdf转换md
# 命令行方式调用本地转换
def execute_mineru(self,import_file_path:Path,file_dir:Path):
    self.log_step("执行mineru转换过程.....")
    # 命令行方式调用本地转换
    # 设置环境变量
    os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
    os.environ["HF_HOME"]= r"D:\dev"
    os.environ["MODELSCOPE_CACHE"] = r"D:\dev"

    # 构建执行客户端命令
    # mineru -p "D:\6W100-整本手册.pdf" -o "D:\mineru" --source local --device cpu --backend pipeline --batch-size 1 --no-auto-download
    cmd = [
        "mineru","-p",
         str(import_file_path),
         "-o",str(file_dir),
         "--source","local"
         "--device","cpu",
         "--backend","pipeline",
         "--batch-size","1",
         "--no-auto-download"
        ]

    # 执行cmd构建命令,创建子进程执行
    proc = subprocess.Popen(
        args=cmd, # 执行命令构建列表
        stdout=subprocess.PIPE,  # 正常执行过程(日志)
        stderr=subprocess.STDOUT, # 错误信息
        errors="replace",  # ignore   replace
        text=True, # 文本形式
        bufsize=1
     )
     # 输出stdout=subprocess.PIPE,每行日志
     for line in proc.stdout:
        self.log_step(f"执行MinerU日志: {line}")

     # 等待子进程操作完成, 返回0成功
     process_code = proc.wait()
     if process_code == 0:
         self.logger.info("执行mineru成功了!!!")
     else:
         self.logger.error("执行mineru失败了...")
     return process_code

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐