Files
pdf/tests/edits/forensic_pdf_objects.py
T
2026-07-30 16:48:46 +05:30

49 lines
1.7 KiB
Python

"""Post-reflow PDF object inspection via Python pdfengine."""
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / "gateway"))
import pdfengine # type: ignore
def inspect_pdf(path: Path, label: str):
doc = pdfengine.PdfDocument.load_from_file(str(path), "")
model = doc.get_page(0).extract_document_model()
para = model.paragraphs[0]
print(f"\n=== {label} ({path.name}) ===")
for li, ln in enumerate(para.lines):
for ri, r in enumerate(ln.runs):
adv_sum = 0.0
if r.glyphs:
# derive advances from origin_x
gs = r.glyphs
for i in range(len(gs)):
if i + 1 < len(gs):
adv_sum += gs[i + 1].origin_x - gs[i].origin_x
else:
adv_sum += gs[i].bbox_w or r.font_size * 0.5
print(f" line{li} run{ri}: text={repr(r.text[:40])} font={r.font_name} size={r.font_size:.3f} w={r.w:.3f} advSum={adv_sum:.3f} glyphs={len(r.glyphs)}")
def main():
extract_path = ROOT / "tests" / "edits" / "forensic_extract_out.json"
ex = json.loads(extract_path.read_text(encoding="utf-8"))
pdf_path = Path(ex["pdf"])
inspect_pdf(pdf_path, "ORIGINAL")
doc = pdfengine.PdfDocument.load_from_file(str(pdf_path), "")
for label, key in [("ENTRY", "editEntry"), ("ONE_CHAR", "editOne")]:
op = ex["payloads"][key]
d = pdfengine.PdfDocument.load_from_file(str(pdf_path), "")
d.apply_edits(json.dumps(op))
out = d.save_full()
tmp = ROOT / "tests" / "edits" / f"_forensic_tmp_{key}.pdf"
tmp.write_bytes(out)
inspect_pdf(tmp, label)
if __name__ == "__main__":
main()