detect_footer_by_model.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import os
  2. import collections # 统计库
  3. import re # 正则
  4. from libs.commons import fitz # pyMuPDF库
  5. import json # json
  6. def parse_footers(page_ID: int, page: fitz.Page, json_from_DocXchain_obj: dict):
  7. """
  8. :param page_ID: int类型,当前page在当前pdf文档中是第page_D页。
  9. :param page :fitz读取的当前页的内容
  10. :param res_dir_path: str类型,是每一个pdf文档,在当前.py文件的目录下生成一个与pdf文档同名的文件夹,res_dir_path就是文件夹的dir
  11. :param json_from_DocXchain_obj: dict类型,把pdf文档送入DocXChain模型中后,提取bbox,结果保存到pdf文档同名文件夹下的 page_ID.json文件中了。json_from_DocXchain_obj就是打开后的dict
  12. """
  13. DPI = 72 # use this resolution
  14. pix = page.get_pixmap(dpi=DPI)
  15. pageL = 0
  16. pageR = int(pix.w)
  17. pageU = 0
  18. pageD = int(pix.h)
  19. #--------- 通过json_from_DocXchain来获取 footer ---------#
  20. footer_bbox_from_DocXChain = []
  21. xf_json = json_from_DocXchain_obj
  22. width_from_json = xf_json['page_info']['width']
  23. height_from_json = xf_json['page_info']['height']
  24. LR_scaleRatio = width_from_json / (pageR - pageL)
  25. UD_scaleRatio = height_from_json / (pageD - pageU)
  26. # {0: 'title', # 标题
  27. # 1: 'figure', # 图片
  28. # 2: 'plain text', # 文本
  29. # 3: 'header', # 页眉
  30. # 4: 'page number', # 页码
  31. # 5: 'footnote', # 脚注
  32. # 6: 'footer', # 页脚
  33. # 7: 'table', # 表格
  34. # 8: 'table caption', # 表格描述
  35. # 9: 'figure caption', # 图片描述
  36. # 10: 'equation', # 公式
  37. # 11: 'full column', # 单栏
  38. # 12: 'sub column', # 多栏
  39. # 13: 'embedding', # 嵌入公式
  40. # 14: 'isolated'} # 单行公式
  41. for xf in xf_json['layout_dets']:
  42. L = xf['poly'][0] / LR_scaleRatio
  43. U = xf['poly'][1] / UD_scaleRatio
  44. R = xf['poly'][2] / LR_scaleRatio
  45. D = xf['poly'][5] / UD_scaleRatio
  46. # L += pageL # 有的页面,artBox偏移了。不在(0,0)
  47. # R += pageL
  48. # U += pageU
  49. # D += pageU
  50. L, R = min(L, R), max(L, R)
  51. U, D = min(U, D), max(U, D)
  52. if xf['category_id'] == 6 and xf['score'] >= 0.3:
  53. footer_bbox_from_DocXChain.append((L, U, R, D))
  54. footer_final_names = []
  55. footer_final_bboxs = []
  56. footer_ID = 0
  57. for L, U, R, D in footer_bbox_from_DocXChain:
  58. # cur_footer = page.get_pixmap(clip=(L,U,R,D))
  59. new_footer_name = "footer_{}_{}.png".format(page_ID, footer_ID) # 脚注name
  60. # cur_footer.save(res_dir_path + '/' + new_footer_name) # 把页脚存储在新建的文件夹,并命名
  61. footer_final_names.append(new_footer_name) # 把脚注的名字存在list中
  62. footer_final_bboxs.append((L, U, R, D))
  63. footer_ID += 1
  64. footer_final_bboxs.sort(key = lambda LURD: (LURD[1], LURD[0]))
  65. curPage_all_footer_bboxs = footer_final_bboxs
  66. return curPage_all_footer_bboxs