AbsPipe.py 4.4 KB

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