AbsPipe.py 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from abc import ABC, abstractmethod
  2. from magic_pdf.data.data_reader_writer import DataWriter
  3. from magic_pdf.dict2md.ocr_mkcontent import union_make
  4. from magic_pdf.filter.pdf_classify_by_type import classify
  5. from magic_pdf.filter.pdf_meta_scan import pdf_meta_scan
  6. from magic_pdf.libs.drop_reason import DropReason
  7. from magic_pdf.libs.json_compressor import JsonCompressor
  8. from magic_pdf.libs.MakeContentConfig import DropMode, MakeMode
  9. class AbsPipe(ABC):
  10. """txt和ocr处理的抽象类."""
  11. PIP_OCR = 'ocr'
  12. PIP_TXT = 'txt'
  13. def __init__(self, pdf_bytes: bytes, model_list: list, image_writer: DataWriter, is_debug: bool = False,
  14. start_page_id=0, end_page_id=None, lang=None, layout_model=None, formula_enable=None, table_enable=None):
  15. self.pdf_bytes = pdf_bytes
  16. self.model_list = model_list
  17. self.image_writer = image_writer
  18. self.pdf_mid_data = None # 未压缩
  19. self.is_debug = is_debug
  20. self.start_page_id = start_page_id
  21. self.end_page_id = end_page_id
  22. self.lang = lang
  23. self.layout_model = layout_model
  24. self.formula_enable = formula_enable
  25. self.table_enable = table_enable
  26. def get_compress_pdf_mid_data(self):
  27. return JsonCompressor.compress_json(self.pdf_mid_data)
  28. @abstractmethod
  29. def pipe_classify(self):
  30. """有状态的分类."""
  31. raise NotImplementedError
  32. @abstractmethod
  33. def pipe_analyze(self):
  34. """有状态的跑模型分析."""
  35. raise NotImplementedError
  36. @abstractmethod
  37. def pipe_parse(self):
  38. """有状态的解析."""
  39. raise NotImplementedError
  40. def pipe_mk_uni_format(self, img_parent_path: str, drop_mode=DropMode.WHOLE_PDF):
  41. content_list = AbsPipe.mk_uni_format(self.get_compress_pdf_mid_data(), img_parent_path, drop_mode)
  42. return content_list
  43. def pipe_mk_markdown(self, img_parent_path: str, drop_mode=DropMode.WHOLE_PDF, md_make_mode=MakeMode.MM_MD):
  44. md_content = AbsPipe.mk_markdown(self.get_compress_pdf_mid_data(), img_parent_path, drop_mode, md_make_mode)
  45. return md_content
  46. @staticmethod
  47. def classify(pdf_bytes: bytes) -> str:
  48. """根据pdf的元数据,判断是文本pdf,还是ocr pdf."""
  49. pdf_meta = pdf_meta_scan(pdf_bytes)
  50. if pdf_meta.get('_need_drop', False): # 如果返回了需要丢弃的标志,则抛出异常
  51. raise Exception(f"pdf meta_scan need_drop,reason is {pdf_meta['_drop_reason']}")
  52. else:
  53. is_encrypted = pdf_meta['is_encrypted']
  54. is_needs_password = pdf_meta['is_needs_password']
  55. if is_encrypted or is_needs_password: # 加密的,需要密码的,没有页面的,都不处理
  56. raise Exception(f'pdf meta_scan need_drop,reason is {DropReason.ENCRYPTED}')
  57. else:
  58. is_text_pdf, results = classify(
  59. pdf_meta['total_page'],
  60. pdf_meta['page_width_pts'],
  61. pdf_meta['page_height_pts'],
  62. pdf_meta['image_info_per_page'],
  63. pdf_meta['text_len_per_page'],
  64. pdf_meta['imgs_per_page'],
  65. pdf_meta['text_layout_per_page'],
  66. pdf_meta['invalid_chars'],
  67. )
  68. if is_text_pdf:
  69. return AbsPipe.PIP_TXT
  70. else:
  71. return AbsPipe.PIP_OCR
  72. @staticmethod
  73. def mk_uni_format(compressed_pdf_mid_data: str, img_buket_path: str, drop_mode=DropMode.WHOLE_PDF) -> list:
  74. """根据pdf类型,生成统一格式content_list."""
  75. pdf_mid_data = JsonCompressor.decompress_json(compressed_pdf_mid_data)
  76. pdf_info_list = pdf_mid_data['pdf_info']
  77. content_list = union_make(pdf_info_list, MakeMode.STANDARD_FORMAT, drop_mode, img_buket_path)
  78. return content_list
  79. @staticmethod
  80. def mk_markdown(compressed_pdf_mid_data: str, img_buket_path: str, drop_mode=DropMode.WHOLE_PDF, md_make_mode=MakeMode.MM_MD) -> list:
  81. """根据pdf类型,markdown."""
  82. pdf_mid_data = JsonCompressor.decompress_json(compressed_pdf_mid_data)
  83. pdf_info_list = pdf_mid_data['pdf_info']
  84. md_content = union_make(pdf_info_list, md_make_mode, drop_mode, img_buket_path)
  85. return md_content