49 lines
1.7 KiB
Python
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()
|