_tmp_shape_dump.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # -*- coding: utf-8 -*-
  2. """读回盖章版里每个浮动图形的实际尺寸、角度与所在页,核实是否符合实物尺寸。"""
  3. import io
  4. import os
  5. import sys
  6. import time
  7. from collections import defaultdict
  8. sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
  9. BID = r"C:\Users\skygu\OneDrive\Projects\AIDOP\项目\项目招投标"
  10. NAME = "响应文件(完整版)-2026年河南产互联制造业数据智能运营平台研发项目.docx"
  11. OUT = os.path.join(BID, NAME[:-5] + "(已签章).docx")
  12. MM = 2.8346457
  13. WD_PAGE = 3
  14. import win32com.client as win32
  15. word = None
  16. for i in range(4):
  17. try:
  18. word = win32.gencache.EnsureDispatch("Word.Application")
  19. word.Visible = False
  20. word.DisplayAlerts = 0
  21. break
  22. except Exception as e:
  23. print(f" 重试 {i + 1}/4:{e}")
  24. time.sleep(4)
  25. doc = word.Documents.Open(OUT, ReadOnly=True)
  26. try:
  27. print(f"浮动图形 {doc.Shapes.Count} 个\n")
  28. print(f"{'#':>3} {'页':>4} {'宽mm':>7} {'高mm':>7} {'角度':>7} 名称")
  29. kinds = defaultdict(list)
  30. for i in range(1, doc.Shapes.Count + 1):
  31. s = doc.Shapes(i)
  32. w, h = float(s.Width) / MM, float(s.Height) / MM
  33. rot = float(s.Rotation)
  34. pg = int(s.Anchor.Information(WD_PAGE))
  35. kind = ("公章" if abs(w - h) < 1.5 and w > 35 else
  36. "印鉴" if abs(w - h) < 1.5 else "签名")
  37. kinds[kind].append((w, h, rot))
  38. print(f"{i:>3} {pg:>4} {w:7.2f} {h:7.2f} {rot:+7.2f} {kind}")
  39. print()
  40. for k, v in kinds.items():
  41. ws = [x[0] for x in v]
  42. rs = sorted(round(x[2], 1) for x in v)
  43. print(f"{k}:{len(v)} 个 宽 {min(ws):.2f}–{max(ws):.2f}mm "
  44. f"角度 {min(rs):+.1f}°–{max(rs):+.1f}° "
  45. f"互不相同 {len(set(rs)) == len(rs)}")
  46. finally:
  47. doc.Close(False)
  48. word.Quit()