Files

65 lines
2.9 KiB
Python

"""Diagnose the 'star broke the font + overlap' report. Edit a Calibri run adding * and the unicode
star, then check: which font emitted, whether the glyphs are present, and whether consecutive glyphs
OVERLAP (x positions go backwards / a glyph has ~0 advance).
Run: gateway/.venv/Scripts/python.exe tests/edits/_symbol_diag.py
"""
from __future__ import annotations
import json, sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, r"C:\Users\furqa\pdfeng-build\win-local-pdfium\lib")
sys.path.insert(1, str(ROOT / "gateway"))
import pdfengine
PDF = ROOT / "Mo-Faishal-Qureshi.pdf"
def ptext(p):
return "".join(r.text for ln in p.lines for r in ln.runs)
def main():
doc = pdfengine.PdfDocument.load_from_memory(PDF.read_bytes(), "")
m = doc.get_page(1).extract_document_model()
para = next(p for p in m.paragraphs if "Designed high-performance" in ptext(p))
oi = [i for ln in para.lines for r in ln.runs for i in r.object_indices]
cl = min(ln.x for ln in para.lines); cr = max(ln.x + ln.w for ln in para.lines)
fb = max(ln.baseline_y for ln in para.lines)
bls = sorted({round(ln.baseline_y, 1) for ln in para.lines}, reverse=True)
lead = abs(bls[0]-bls[1]) if len(bls) > 1 else 14.0
fid = para.lines[0].runs[0].internal_font_id
print("fid:", fid)
new_text = "Star test asterisk * and blackstar ★ end"
op = {"version": "1.0", "operations": [{"id": "s", "type": "reflow_paragraph", "pageIndex": 1, "data": {
"objectIndices": oi, "runs": [{"text": new_text, "internalFontId": fid, "fontSize": 11.0, "color": "#000000"}],
"columnLeft": cl, "columnRight": cr, "firstBaselineY": fb, "leading": lead,
"oldLineCount": len(para.lines), "align": "left", "paraId": "SYMCHK"}}]}
doc.apply_edits(json.dumps(op))
r = pdfengine.PdfDocument.load_from_memory(doc.save_full(), "")
for pg in range(r.page_count):
for p in r.get_page(pg).extract_document_model().paragraphs:
if "asterisk" in ptext(p):
fonts = sorted({rr.font_name for ln in p.lines for rr in ln.runs if rr.text.strip()})
txt = ptext(p)
print("emitted fonts:", fonts)
print("has '*':", "*" in txt, " has U+2605:", "★" in txt)
gl = [(g.text, g.origin_x) for ln in p.lines for rr in ln.runs for g in rr.glyphs]
print("All glyphs:")
for text, x in gl:
print(f" {repr(text)}: x={x:.2f}")
overlaps = 0
for a, b in zip(gl, gl[1:]):
if b[1] <= a[1] - 0.5 and b[1] > 0:
overlaps += 1
print(f"glyphs={len(gl)} backward/overlap steps={overlaps}")
s = txt.find("blackstar")
print("around star:", repr(txt[max(0,s-6):s+20]))
return
if __name__ == "__main__":
main()