65 lines
2.9 KiB
Python
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()
|