detect_equation.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import os
  2. import collections # 统计库
  3. import re # 正则
  4. from libs.commons import fitz # pyMuPDF库
  5. import json # json
  6. from pathlib import Path
  7. def parse_equations(page_ID: int, page: fitz.Page, json_from_DocXchain_obj: dict):
  8. """
  9. :param page_ID: int类型,当前page在当前pdf文档中是第page_D页。
  10. :param page :fitz读取的当前页的内容
  11. :param res_dir_path: str类型,是每一个pdf文档,在当前.py文件的目录下生成一个与pdf文档同名的文件夹,res_dir_path就是文件夹的dir
  12. :param json_from_DocXchain_obj: dict类型,把pdf文档送入DocXChain模型中后,提取bbox,结果保存到pdf文档同名文件夹下的 page_ID.json文件中了。json_from_DocXchain_obj就是打开后的dict
  13. """
  14. DPI = 72 # use this resolution
  15. pix = page.get_pixmap(dpi=DPI)
  16. pageL = 0
  17. pageR = int(pix.w)
  18. pageU = 0
  19. pageD = int(pix.h)
  20. #--------- 通过json_from_DocXchain来获取 table ---------#
  21. equationEmbedding_from_DocXChain_bboxs = []
  22. equationIsolated_from_DocXChain_bboxs = []
  23. xf_json = json_from_DocXchain_obj
  24. width_from_json = xf_json['page_info']['width']
  25. height_from_json = xf_json['page_info']['height']
  26. LR_scaleRatio = width_from_json / (pageR - pageL)
  27. UD_scaleRatio = height_from_json / (pageD - pageU)
  28. for xf in xf_json['layout_dets']:
  29. # {0: 'title', 1: 'figure', 2: 'plain text', 3: 'header', 4: 'page number', 5: 'footnote', 6: 'footer', 7: 'table', 8: 'table caption', 9: 'figure caption', 10: 'equation', 11: 'full column', 12: 'sub column'}
  30. L = xf['poly'][0] / LR_scaleRatio
  31. U = xf['poly'][1] / UD_scaleRatio
  32. R = xf['poly'][2] / LR_scaleRatio
  33. D = xf['poly'][5] / UD_scaleRatio
  34. # L += pageL # 有的页面,artBox偏移了。不在(0,0)
  35. # R += pageL
  36. # U += pageU
  37. # D += pageU
  38. L, R = min(L, R), max(L, R)
  39. U, D = min(U, D), max(U, D)
  40. # equation
  41. img_suffix = f"{page_ID}_{int(L)}_{int(U)}_{int(R)}_{int(D)}"
  42. if xf['category_id'] == 13 and xf['score'] >= 0.3:
  43. latex_text = xf.get("latex", "EmptyInlineEquationResult")
  44. debugable_latex_text = f"{latex_text}|{img_suffix}"
  45. equationEmbedding_from_DocXChain_bboxs.append((L, U, R, D, latex_text))
  46. if xf['category_id'] == 14 and xf['score'] >= 0.3:
  47. latex_text = xf.get("latex", "EmptyInterlineEquationResult")
  48. debugable_latex_text = f"{latex_text}|{img_suffix}"
  49. equationIsolated_from_DocXChain_bboxs.append((L, U, R, D, latex_text))
  50. #---------------------------------------- 排序,编号,保存 -----------------------------------------#
  51. equationIsolated_from_DocXChain_bboxs.sort(key = lambda LURD: (LURD[1], LURD[0]))
  52. equationIsolated_from_DocXChain_bboxs.sort(key = lambda LURD: (LURD[1], LURD[0]))
  53. equationEmbedding_from_DocXChain_names = []
  54. equationEmbedding_ID = 0
  55. equationIsolated_from_DocXChain_names = []
  56. equationIsolated_ID = 0
  57. for L, U, R, D, _ in equationEmbedding_from_DocXChain_bboxs:
  58. if not(L < R and U < D):
  59. continue
  60. try:
  61. # cur_equation = page.get_pixmap(clip=(L,U,R,D))
  62. new_equation_name = "equationEmbedding_{}_{}.png".format(page_ID, equationEmbedding_ID) # 公式name
  63. # cur_equation.save(res_dir_path + '/' + new_equation_name) # 把公式存出在新建的文件夹,并命名
  64. equationEmbedding_from_DocXChain_names.append(new_equation_name) # 把公式的名字存在list中,方便在md中插入引用
  65. equationEmbedding_ID += 1
  66. except:
  67. pass
  68. for L, U, R, D, _ in equationIsolated_from_DocXChain_bboxs:
  69. if not(L < R and U < D):
  70. continue
  71. try:
  72. # cur_equation = page.get_pixmap(clip=(L,U,R,D))
  73. new_equation_name = "equationEmbedding_{}_{}.png".format(page_ID, equationIsolated_ID) # 公式name
  74. # cur_equation.save(res_dir_path + '/' + new_equation_name) # 把公式存出在新建的文件夹,并命名
  75. equationIsolated_from_DocXChain_names.append(new_equation_name) # 把公式的名字存在list中,方便在md中插入引用
  76. equationIsolated_ID += 1
  77. except:
  78. pass
  79. equationEmbedding_from_DocXChain_bboxs.sort(key = lambda LURD: (LURD[1], LURD[0]))
  80. equationIsolated_from_DocXChain_bboxs.sort(key = lambda LURD: (LURD[1], LURD[0]))
  81. """根据pdf可视区域,调整bbox的坐标"""
  82. cropbox = page.cropbox
  83. if cropbox[0]!=page.rect[0] or cropbox[1]!=page.rect[1]:
  84. for eq_box in equationEmbedding_from_DocXChain_bboxs:
  85. eq_box = [eq_box[0]+cropbox[0], eq_box[1]+cropbox[1], eq_box[2]+cropbox[0], eq_box[3]+cropbox[1], eq_box[4]]
  86. for eq_box in equationIsolated_from_DocXChain_bboxs:
  87. eq_box = [eq_box[0]+cropbox[0], eq_box[1]+cropbox[1], eq_box[2]+cropbox[0], eq_box[3]+cropbox[1], eq_box[4]]
  88. return equationEmbedding_from_DocXChain_bboxs, equationIsolated_from_DocXChain_bboxs