mineru_parser.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import os, sys
  2. from document_parser import DocumentParser
  3. from dotenv import load_dotenv
  4. # 导入MinerU相关模块
  5. from mineru.cli.common import convert_pdf_bytes_to_bytes_by_pypdfium2
  6. from mineru.backend.vlm.vlm_analyze import doc_analyze as vlm_doc_analyze
  7. from mineru.backend.vlm.vlm_middle_json_mkcontent import union_make as vlm_union_make
  8. from mineru.utils.enum_class import MakeMode
  9. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  10. from logger.logging import setup_logging
  11. load_dotenv()
  12. logger = setup_logging()
  13. class MinerUParser(DocumentParser):
  14. """MinerU文档解析器,专门用于解析PDF文档"""
  15. def __init__(self):
  16. """
  17. 初始化MinerU解析器
  18. Args:
  19. server_url (str): MinerU服务器地址,默认从环境变量或使用默认值
  20. """
  21. self.server_url = os.getenv("MINERU_SERVER_URL")
  22. if not self.server_url:
  23. raise ValueError("MINERU_SERVER_URL 环境变量未设置")
  24. logger.info(f"MinerU服务器地址: {self.server_url}")
  25. def parse(self, data: bytes) -> str:
  26. """解析PDF文档"""
  27. try:
  28. logger.info("正在使用MinerU解析PDF文档...")
  29. # 转换PDF字节数据
  30. logger.info("正在转换PDF字节数据...")
  31. pdf_bytes = convert_pdf_bytes_to_bytes_by_pypdfium2(data, 0, None)
  32. # 使用VLM分析PDF
  33. logger.info("正在分析PDF文档...")
  34. middle_json, infer_result = vlm_doc_analyze(
  35. pdf_bytes,
  36. backend="http-client",
  37. server_url=self.server_url,
  38. image_writer=None
  39. )
  40. # 获取PDF信息
  41. pdf_info = middle_json["pdf_info"]
  42. # 生成Markdown内容
  43. logger.info("正在生成Markdown内容...")
  44. md_content_str = vlm_union_make(pdf_info, MakeMode.MM_MD, None)
  45. logger.info(f"MinerU解析完成,生成了{len(md_content_str)}字符的Markdown内容")
  46. return md_content_str.strip()
  47. except ImportError as e:
  48. logger.error(f"MinerU模块导入失败: {e}")
  49. logger.error("请确保已正确安装MinerU相关依赖")
  50. return ""
  51. except Exception as e:
  52. logger.error(f"MinerU解析失败: {e}")
  53. return ""
  54. def supports(self, content_type: str) -> bool:
  55. """检查是否支持PDF格式"""
  56. return content_type.lower() in ['application/pdf', 'pdf']
  57. if __name__ == "__main__":
  58. parser = MinerUParser()
  59. with open("../data/pdf3.pdf", "rb") as f:
  60. data = f.read()
  61. result = parser.parse(data)
  62. print("-"*100)
  63. print(result)