Python简单使用MinerU

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

Python简单使用MinerU

1 简介

MinerU是国产的一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。现在支持图像(.jpg及.png)、PDF、Word(.doc及.docx)、以及PowerPoint(.ppt及.pptx)等。
  1. # 官网地址
  2. https://mineru.readthedocs.io/en/latest/index.html
  3. # Github地址
  4. https://github.com/opendatalab/mineru
  5. # API接口地址
  6. https://mineru.readthedocs.io/en/latest/user_guide/quick_start/convert_pdf.html
  7. # 模型下载脚本地址
  8. # 从ModelScope下载模型:download_models.py
  9. # 从HuggingFace下载模型: download_models_hf.py
  10. https://github.com/opendatalab/MinerU/tree/master/scripts
复制代码
2 安装MinerU

安装Python环境
  1. # 我的版本是:magic-pdf==1.1.0
  2. pip install -U "magic-pdf[full]" -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
下载权重
官网提供了HuggingFace和ModelScope两种方法下载,本文从ModlScope上下载,
  1. # 官网下载方法地址
  2. https://github.com/opendatalab/MinerU/blob/master/docs/how_to_download_models_zh_cn.md
复制代码
开始下载权重
⚠️ 注意:模子下载完成后,脚本会自动生成用户目录下的magic-pdf.json文件,并自动配置默认模子路径。 您可在【用户目录】下找到magic-pdf.json文件。
  1. # 安装modelscope
  2. pip install modelscope
  3. # 下载文件
  4. wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/scripts/download_models.py -O download_models.py
  5. # 也可以到下面的地址,找到download_models.py下载
  6. https://github.com/opendatalab/MinerU/tree/master/scripts
  7. # 执行下载模型
  8. # 为了方便使用模型,我修改了download_models.py,添加了设置模型的位置。
  9. python download_models.py
复制代码
修改后的download_models.py
⚠️ 此步可以不做。
文件中的local_dir是我新加的下载模子的位置,如果不设置会下载到下面貌录中:windows的用户目录为 “C:\Users\用户名”, linux用户目录为 “/home/用户名”。
  1. import json
  2. import os
  3. import requests
  4. from modelscope import snapshot_download
  5. def download_json(url):
  6.     # 下载JSON文件
  7.     response = requests.get(url)
  8.     response.raise_for_status()  # 检查请求是否成功
  9.     return response.json()
  10. def download_and_modify_json(url, local_filename, modifications):
  11.     if os.path.exists(local_filename):
  12.         data = json.load(open(local_filename))
  13.         config_version = data.get('config_version', '0.0.0')
  14.         if config_version < '1.1.1':
  15.             data = download_json(url)
  16.     else:
  17.         data = download_json(url)
  18.     # 修改内容
  19.     for key, value in modifications.items():
  20.         data[key] = value
  21.     # 保存修改后的内容
  22.     with open(local_filename, 'w', encoding='utf-8') as f:
  23.         json.dump(data, f, ensure_ascii=False, indent=4)
  24. if __name__ == '__main__':
  25.     mineru_patterns = [
  26.         "models/Layout/LayoutLMv3/*",
  27.         "models/Layout/YOLO/*",
  28.         "models/MFD/YOLO/*",
  29.         "models/MFR/unimernet_small_2501/*",
  30.         "models/TabRec/TableMaster/*",
  31.         "models/TabRec/StructEqTable/*",
  32.     ]
  33.     # 设置模型下载的位置
  34.     local_dir="E:/mineru"
  35.     # 下载模型
  36.     model_dir = snapshot_download('opendatalab/PDF-Extract-Kit-1.0', allow_patterns=mineru_patterns, local_dir=local_dir)
  37.     layoutreader_model_dir = snapshot_download('ppaanngggg/layoutreader', local_dir=local_dir)
  38.     model_dir = model_dir + '/models'
  39.     print(f'model_dir is: {model_dir}')
  40.     print(f'layoutreader_model_dir is: {layoutreader_model_dir}')
  41.     json_url = 'https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/magic-pdf.template.json'
  42.     config_file_name = 'magic-pdf.json'
  43.     home_dir = os.path.expanduser('~')
  44.     config_file = os.path.join(home_dir, config_file_name)
  45.     json_mods = {
  46.         'models-dir': model_dir,
  47.         'layoutreader-model-dir': layoutreader_model_dir,
  48.     }
  49.     download_and_modify_json(json_url, config_file, json_mods)
  50.     print(f'The configuration file has been configured successfully, the path is: {config_file}')
复制代码
3 Python使用MinerU

Python安装完MinerU后,可以直接执行下面的代码,首次执行时会自动下载PaddleOCR模子的权重和参数,PaddleOCR模子会自动下载到用户目录下的.paddleocr目录下。
解析PDF文件的Python代码如下:
  1. import os
  2. from magic_pdf.data.data_reader_writer import FileBasedDataWriter, FileBasedDataReader
  3. from magic_pdf.data.dataset import PymuDocDataset
  4. from magic_pdf.model.doc_analyze_by_custom_model import doc_analyze
  5. from magic_pdf.config.enums import SupportedPdfParseMethod
  6. # pdf文件路径
  7. pdf_file_path = "E:/hello/test-5-2.pdf"
  8. # 获取没有后缀的pdf文件名称
  9. pdf_file_path_without_suff = pdf_file_path.split(".")[0]
  10. print(pdf_file_path_without_suff)
  11. # 文件所在的目录
  12. pdf_file_path_parent_dir = os.path.dirname(pdf_file_path)
  13. image_dir = os.path.join(pdf_file_path_parent_dir, "images")
  14. print(image_dir)
  15. # Markdown的写入实例
  16. # markdown_dir = "./output/markdown"
  17. # writer_markdown = FileBasedDataWriter(markdown_dir)
  18. writer_markdown = FileBasedDataWriter()
  19. # 读取图片
  20. writer_image = FileBasedDataWriter(image_dir)
  21. # 读取文件流
  22. reader_pdf = FileBasedDataReader("")
  23. bytes_pdf = reader_pdf.read(pdf_file_path)
  24. # 处理数据
  25. dataset_pdf = PymuDocDataset(bytes_pdf)
  26. # 判断是否支持ocr
  27. if dataset_pdf.classify() == SupportedPdfParseMethod.OCR:
  28.     # 支持OCR
  29.     infer_result = dataset_pdf.apply(doc_analyze, ocr=True)
  30.     pipe_result = infer_result.pipe_ocr_mode(writer_image)
  31. else:
  32.     # 不支持OCR
  33.     infer_result = dataset_pdf.apply(doc_analyze, ocr=False)
  34.     pipe_result = infer_result.pipe_txt_mode(writer_image)
  35. # 在每一页上都使用模型解析文本
  36. infer_result.draw_model(pdf_file_path)
  37. # 获取模型处理后的结果
  38. model_inference_result = infer_result.get_infer_res()
  39. print(model_inference_result)
  40. # 为pdf生成含有颜色标注布局的pdf文件
  41. pipe_result.draw_layout(f"{pdf_file_path_without_suff}_layout.pdf")
  42. # 为pdf生成含有颜色标注文本行的pdf文件
  43. pipe_result.draw_span(f"{pdf_file_path_without_suff}_spans.pdf")
  44. # 获取markdown的内容
  45. markdown_content = pipe_result.get_markdown(image_dir)
  46. print(markdown_content)
  47. # 保存markdown文件
  48. # pipe_result.dump_md(writer_markdown, f"{pdf_file_path_without_suff}.md", image_dir)
  49. pipe_result.dump_md(writer_markdown, f"{pdf_file_path_without_suff}.md", image_dir)
  50. # json文本列表
  51. # 数据类型包括type、text、text_level、page_idx、img_path等
  52. content_list_content = pipe_result.get_content_list(image_dir)
  53. print(content_list_content)
  54. # 保存json文本列表
  55. pipe_result.dump_content_list(writer_markdown, f"{pdf_file_path_without_suff}_content_list.json", image_dir)
  56. # 获取含有位置信息的json文本
  57. middle_json_content = pipe_result.get_middle_json()
  58. # 保存含有位置信息的json文本
  59. pipe_result.dump_middle_json(writer_markdown, f'{pdf_file_path_without_suff}_middle.json')
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表