gfdfg
This commit is contained in:
81
python/probe_checkbox.py
Normal file
81
python/probe_checkbox.py
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
probe_checkbox.py - Untersucht, was pdfplumber an Grafik/Annotationen auf der
|
||||
Info-Seite sieht, speziell rund um die YES/NO-Checkbox.
|
||||
|
||||
Aufruf:
|
||||
python3 probe_checkbox.py --pdf ~/data/S/"Sturgill, Garett 040126.pdf"
|
||||
"""
|
||||
import argparse
|
||||
import pdfplumber
|
||||
|
||||
ANCHOR_INFO = "BUYER INFORMATION SHEET"
|
||||
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--pdf", required=True)
|
||||
args = ap.parse_args()
|
||||
|
||||
with pdfplumber.open(args.pdf) as pdf:
|
||||
# Info-Seite per Anker finden
|
||||
info_page = None
|
||||
for i, page in enumerate(pdf.pages):
|
||||
txt = page.extract_text() or ""
|
||||
if ANCHOR_INFO in txt:
|
||||
info_page = page
|
||||
print(f"Info-Seite gefunden: Seite {i+1}\n")
|
||||
break
|
||||
if info_page is None:
|
||||
print("Keine Info-Seite gefunden!")
|
||||
raise SystemExit(1)
|
||||
|
||||
# Finde die Y-Position der Checkbox-Zeile ("INTEREST?" ... "YES" ... "NO")
|
||||
words = info_page.extract_words()
|
||||
yes_word = no_word = interest_word = None
|
||||
for w in words:
|
||||
t = w["text"].upper().strip(".:?")
|
||||
if t == "YES" and yes_word is None:
|
||||
yes_word = w
|
||||
elif t == "NO" and no_word is None:
|
||||
no_word = w
|
||||
elif "INTEREST" in t and interest_word is None:
|
||||
interest_word = w
|
||||
|
||||
print("=== Position der Schluesselwoerter ===")
|
||||
for label, w in [("INTEREST", interest_word), ("YES", yes_word), ("NO", no_word)]:
|
||||
if w:
|
||||
print(f" {label:10} x0={w['x0']:.0f} x1={w['x1']:.0f} top={w['top']:.0f} bottom={w['bottom']:.0f}")
|
||||
else:
|
||||
print(f" {label:10} NICHT GEFUNDEN")
|
||||
|
||||
if not (yes_word and no_word):
|
||||
print("\nYES/NO nicht beide gefunden - Analyse eingeschraenkt.")
|
||||
|
||||
# Grafik-Elemente in der Naehe der YES/NO-Zeile untersuchen
|
||||
print(f"\n=== Grafik-Elemente (rects/lines/curves) auf der Info-Seite ===")
|
||||
print(f" rects: {len(info_page.rects)}")
|
||||
print(f" lines: {len(info_page.lines)}")
|
||||
print(f" curves: {len(info_page.curves)}")
|
||||
|
||||
# Die Checkbox-Zeile hat ein bestimmtes 'top'. Zeige alle Rects/Lines in
|
||||
# diesem Y-Bereich (kleine Quadrate = Checkboxen, Haekchen = curves/lines).
|
||||
if yes_word:
|
||||
y_lo = yes_word["top"] - 5
|
||||
y_hi = yes_word["bottom"] + 5
|
||||
print(f"\n=== Elemente im Y-Bereich der YES/NO-Zeile (top {y_lo:.0f}..{y_hi:.0f}) ===")
|
||||
print(" --- Rechtecke (moegliche Checkboxen) ---")
|
||||
for r in info_page.rects:
|
||||
if y_lo <= r["top"] <= y_hi or y_lo <= r["bottom"] <= y_hi:
|
||||
w_ = r["x1"]-r["x0"]; h_ = r["bottom"]-r["top"]
|
||||
print(f" x0={r['x0']:.0f} top={r['top']:.0f} groesse={w_:.0f}x{h_:.0f}")
|
||||
print(" --- Linien/Kurven (moegliche Haekchen) ---")
|
||||
for el in info_page.lines + info_page.curves:
|
||||
if y_lo <= el["top"] <= y_hi or y_lo <= el["bottom"] <= y_hi:
|
||||
print(f" typ x0={el['x0']:.0f} x1={el['x1']:.0f} top={el['top']:.0f} bottom={el['bottom']:.0f}")
|
||||
|
||||
# Annotationen (Formularfelder / Widgets)?
|
||||
print(f"\n=== Annotationen (Formular-Widgets) ===")
|
||||
annots = info_page.annots or []
|
||||
print(f" Anzahl: {len(annots)}")
|
||||
for a in annots[:15]:
|
||||
print(f" {a.get('data',{}).get('Subtype','?')} @ top={a.get('top',0):.0f} "
|
||||
f"x0={a.get('x0',0):.0f} {str(a.get('data',{}).get('AS',''))[:30]}")
|
||||
Reference in New Issue
Block a user