# -*- coding: utf-8 -*- from pathlib import Path from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE p = Path(r"E:\桌面\实训项目\smart-hospital\ppt\智慧医院_AI影像诊断与电子病历辅助决策系统_答辩PPT.pptx") prs = Presentation(str(p)) def box(sh): return (sh.left, sh.top, sh.left + sh.width, sh.top + sh.height) def area(b): return max(0, b[2] - b[0]) * max(0, b[3] - b[1]) def inter(a, b): l = max(a[0], b[0]) t = max(a[1], b[1]) r = min(a[2], b[2]) btm = min(a[3], b[3]) if r <= l or btm <= t: return 0 return (r - l) * (btm - t) def label(sh): if sh.shape_type == MSO_SHAPE_TYPE.PICTURE: return "[IMG]" if sh.has_table: return "[TABLE]" t = "" if hasattr(sh, "text") and sh.text: t = sh.text.replace("\n", " ").strip()[:50] return t or f"shape#{sh.shape_id}" for si, s in enumerate(prs.slides, 1): shapes = list(s.shapes) boxes = [(box(sh), label(sh), sh) for sh in shapes] issues = [] for i in range(len(boxes)): for j in range(i + 1, len(boxes)): bi, bj = boxes[i][0], boxes[j][0] ia = inter(bi, bj) if ia <= 0: continue min_a = min(area(bi), area(bj)) if min_a == 0: continue ratio = ia / min_a # intentional: text on colored bar, footer text on footer bar # report if ratio high and not pure containment of tiny text in bar if ratio < 0.25: continue t1, t2 = boxes[i][1], boxes[j][1] # skip text fully inside same-color header/footer style if one is short page num issues.append((ratio, t1, t2, bi, bj)) # also content past footer footer_y = int(7.15 * 914400) overflow = [] for b, lab, sh in boxes: if b[1] < footer_y < b[3] and b[3] - footer_y > 50000 and "仅供教学" not in lab and " / " not in lab: # shape crosses into footer zone if sh.shape_type == MSO_SHAPE_TYPE.PICTURE or sh.has_table or (hasattr(sh, "text") and len(sh.text) > 20): overflow.append(lab) if issues or overflow: print(f"=== Slide {si} overlaps={len(issues)} overflow={len(overflow)} ===") for ratio, t1, t2, bi, bj in sorted(issues, reverse=True)[:10]: print(f" r={ratio:.2f}") print(f" A: {t1}") print(f" B: {t2}") print( f" A inches: L={bi[0]/914400:.2f} T={bi[1]/914400:.2f} R={bi[2]/914400:.2f} B={bi[3]/914400:.2f}" ) print( f" B inches: L={bj[0]/914400:.2f} T={bj[1]/914400:.2f} R={bj[2]/914400:.2f} B={bj[3]/914400:.2f}" ) for o in overflow: print(f" FOOTER CROSS: {o}")