common.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import copy
  2. import json as json_parse
  3. import os
  4. import click
  5. from loguru import logger
  6. import magic_pdf.model as model_config
  7. from magic_pdf.libs.draw_bbox import (draw_layout_bbox, draw_span_bbox,
  8. draw_model_bbox, draw_line_sort_bbox)
  9. from magic_pdf.libs.MakeContentConfig import DropMode, MakeMode
  10. from magic_pdf.pipe.OCRPipe import OCRPipe
  11. from magic_pdf.pipe.TXTPipe import TXTPipe
  12. from magic_pdf.pipe.UNIPipe import UNIPipe
  13. from magic_pdf.rw.AbsReaderWriter import AbsReaderWriter
  14. from magic_pdf.rw.DiskReaderWriter import DiskReaderWriter
  15. def prepare_env(output_dir, pdf_file_name, method):
  16. local_parent_dir = os.path.join(output_dir, pdf_file_name, method)
  17. local_image_dir = os.path.join(str(local_parent_dir), 'images')
  18. local_md_dir = local_parent_dir
  19. os.makedirs(local_image_dir, exist_ok=True)
  20. os.makedirs(local_md_dir, exist_ok=True)
  21. return local_image_dir, local_md_dir
  22. def do_parse(
  23. output_dir,
  24. pdf_file_name,
  25. pdf_bytes,
  26. model_list,
  27. parse_method,
  28. debug_able,
  29. f_draw_span_bbox=True,
  30. f_draw_layout_bbox=True,
  31. f_dump_md=True,
  32. f_dump_middle_json=True,
  33. f_dump_model_json=True,
  34. f_dump_orig_pdf=True,
  35. f_dump_content_list=True,
  36. f_make_md_mode=MakeMode.MM_MD,
  37. f_draw_model_bbox=False,
  38. f_draw_line_sort_bbox=False,
  39. start_page_id=0,
  40. end_page_id=None,
  41. lang=None,
  42. ):
  43. if debug_able:
  44. logger.warning('debug mode is on')
  45. # f_dump_content_list = True
  46. f_draw_model_bbox = True
  47. f_draw_line_sort_bbox = True
  48. orig_model_list = copy.deepcopy(model_list)
  49. local_image_dir, local_md_dir = prepare_env(output_dir, pdf_file_name,
  50. parse_method)
  51. image_writer, md_writer = DiskReaderWriter(
  52. local_image_dir), DiskReaderWriter(local_md_dir)
  53. image_dir = str(os.path.basename(local_image_dir))
  54. if parse_method == 'auto':
  55. jso_useful_key = {'_pdf_type': '', 'model_list': model_list}
  56. pipe = UNIPipe(pdf_bytes, jso_useful_key, image_writer, is_debug=True,
  57. start_page_id=start_page_id, end_page_id=end_page_id, lang=lang)
  58. elif parse_method == 'txt':
  59. pipe = TXTPipe(pdf_bytes, model_list, image_writer, is_debug=True,
  60. start_page_id=start_page_id, end_page_id=end_page_id, lang=lang)
  61. elif parse_method == 'ocr':
  62. pipe = OCRPipe(pdf_bytes, model_list, image_writer, is_debug=True,
  63. start_page_id=start_page_id, end_page_id=end_page_id, lang=lang)
  64. else:
  65. logger.error('unknown parse method')
  66. exit(1)
  67. pipe.pipe_classify()
  68. if len(model_list) == 0:
  69. if model_config.__use_inside_model__:
  70. pipe.pipe_analyze()
  71. orig_model_list = copy.deepcopy(pipe.model_list)
  72. else:
  73. logger.error('need model list input')
  74. exit(2)
  75. pipe.pipe_parse()
  76. pdf_info = pipe.pdf_mid_data['pdf_info']
  77. if f_draw_layout_bbox:
  78. draw_layout_bbox(pdf_info, pdf_bytes, local_md_dir, pdf_file_name)
  79. if f_draw_span_bbox:
  80. draw_span_bbox(pdf_info, pdf_bytes, local_md_dir, pdf_file_name)
  81. if f_draw_model_bbox:
  82. draw_model_bbox(copy.deepcopy(orig_model_list), pdf_bytes, local_md_dir, pdf_file_name)
  83. if f_draw_line_sort_bbox:
  84. draw_line_sort_bbox(pdf_info, pdf_bytes, local_md_dir, pdf_file_name)
  85. md_content = pipe.pipe_mk_markdown(image_dir,
  86. drop_mode=DropMode.NONE,
  87. md_make_mode=f_make_md_mode)
  88. if f_dump_md:
  89. md_writer.write(
  90. content=md_content,
  91. path=f'{pdf_file_name}.md',
  92. mode=AbsReaderWriter.MODE_TXT,
  93. )
  94. if f_dump_middle_json:
  95. md_writer.write(
  96. content=json_parse.dumps(pipe.pdf_mid_data,
  97. ensure_ascii=False,
  98. indent=4),
  99. path=f'{pdf_file_name}_middle.json',
  100. mode=AbsReaderWriter.MODE_TXT,
  101. )
  102. if f_dump_model_json:
  103. md_writer.write(
  104. content=json_parse.dumps(orig_model_list,
  105. ensure_ascii=False,
  106. indent=4),
  107. path=f'{pdf_file_name}_model.json',
  108. mode=AbsReaderWriter.MODE_TXT,
  109. )
  110. if f_dump_orig_pdf:
  111. md_writer.write(
  112. content=pdf_bytes,
  113. path=f'{pdf_file_name}_origin.pdf',
  114. mode=AbsReaderWriter.MODE_BIN,
  115. )
  116. content_list = pipe.pipe_mk_uni_format(image_dir, drop_mode=DropMode.NONE)
  117. if f_dump_content_list:
  118. md_writer.write(
  119. content=json_parse.dumps(content_list,
  120. ensure_ascii=False,
  121. indent=4),
  122. path=f'{pdf_file_name}_content_list.json',
  123. mode=AbsReaderWriter.MODE_TXT,
  124. )
  125. logger.info(f'local output dir is {local_md_dir}')
  126. parse_pdf_methods = click.Choice(['ocr', 'txt', 'auto'])