main.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # Copyright (c) Opendatalab. All rights reserved.
  2. """PDF转换工具主入口 v2"""
  3. import argparse
  4. import asyncio
  5. import os
  6. import sys
  7. from pathlib import Path
  8. from .utils.logging_config import get_logger
  9. logger = get_logger("pdf_converter_v2.main")
  10. # 支持在包内和包外两种运行方式
  11. try:
  12. # 尝试相对导入(包内运行)
  13. from .processor.converter import convert_to_markdown
  14. except ImportError:
  15. # 如果相对导入失败,使用绝对导入(包外运行)
  16. from pdf_converter_v2.processor.converter import convert_to_markdown
  17. def main():
  18. """命令行主函数"""
  19. parser = argparse.ArgumentParser(description='将PDF/图片转换为Markdown格式 v2(使用新的API接口)')
  20. # 必需参数
  21. parser.add_argument('input_file', help='输入文件路径(PDF)')
  22. # 输出选项
  23. parser.add_argument('-o', '--output-dir', default='./output', help='输出目录(默认: ./output)')
  24. parser.add_argument('--max-pages', type=int, default=10, help='最大转换页数(默认: 10,通过end_page_id控制)')
  25. # API选项
  26. parser.add_argument('--url', default='http://127.0.0.1:5282', help='API服务器URL(默认: http://127.0.0.1:5282)')
  27. parser.add_argument('--backend', default='vlm-vllm-async-engine', help='处理后端(默认: vlm-vllm-async-engine)')
  28. parser.add_argument('--parse-method', default='auto', help='解析方法(默认: auto)')
  29. parser.add_argument('--start-page-id', type=int, default=0, help='起始页ID(默认: 0)')
  30. parser.add_argument('--end-page-id', type=int, default=99999, help='结束页ID(默认: 99999)')
  31. # 处理选项
  32. parser.add_argument('--no-formula', action='store_true', help='禁用公式识别')
  33. parser.add_argument('--no-table', action='store_true', help='禁用表格识别')
  34. parser.add_argument('--language', default='ch', help='识别语言(默认: ch)')
  35. # 输出格式选项
  36. parser.add_argument('--no-embed-images', action='store_true', help='不嵌入图片(使用相对路径)')
  37. parser.add_argument('--output-json', action='store_true', help='同时输出JSON格式(自动识别文档类型)')
  38. # 日志选项
  39. parser.add_argument('-v', '--verbose', action='store_true', help='详细日志输出')
  40. args = parser.parse_args()
  41. # 配置日志
  42. log_level = "DEBUG" if args.verbose else "INFO"
  43. logger.remove()
  44. logger.add(sys.stderr, level=log_level)
  45. # 验证输入文件
  46. if not os.path.exists(args.input_file):
  47. logger.error(f"输入文件不存在: {args.input_file}")
  48. sys.exit(1)
  49. # 验证文件类型
  50. file_ext = Path(args.input_file).suffix.lower()
  51. if file_ext != '.pdf':
  52. logger.warning(f"输入文件类型为 {file_ext},v2版本主要支持PDF文件")
  53. # 准备参数
  54. formula_enable = not args.no_formula
  55. table_enable = not args.no_table
  56. embed_images = not args.no_embed_images
  57. logger.info(f"开始转换: {args.input_file}")
  58. logger.info(f"使用API: {args.url}")
  59. logger.info(f"处理后端: {args.backend}")
  60. logger.info(f"公式识别: {'启用' if formula_enable else '禁用'}")
  61. logger.info(f"表格识别: {'启用' if table_enable else '禁用'}")
  62. # 执行转换
  63. try:
  64. result = asyncio.run(convert_to_markdown(
  65. input_file=args.input_file,
  66. output_dir=args.output_dir,
  67. max_pages=args.max_pages,
  68. is_ocr=False,
  69. formula_enable=formula_enable,
  70. table_enable=table_enable,
  71. language=args.language,
  72. backend=args.backend,
  73. url=args.url,
  74. embed_images=embed_images,
  75. output_json=args.output_json,
  76. start_page_id=args.start_page_id,
  77. end_page_id=args.end_page_id,
  78. parse_method=args.parse_method,
  79. response_format_zip=True
  80. ))
  81. if result:
  82. logger.info("转换成功完成!")
  83. logger.info(f"Markdown文件: {result['markdown_file']}")
  84. if result.get('json_file'):
  85. logger.info(f"JSON文件: {result['json_file']}")
  86. if result.get('json_data'):
  87. doc_type = result['json_data'].get('document_type', 'unknown')
  88. logger.info(f"文档类型: {doc_type}")
  89. else:
  90. logger.error("转换失败")
  91. sys.exit(1)
  92. except KeyboardInterrupt:
  93. logger.info("用户中断操作")
  94. sys.exit(1)
  95. except Exception as e:
  96. logger.exception(f"转换过程中发生错误: {e}")
  97. sys.exit(1)
  98. if __name__ == '__main__':
  99. main()