Files

61 lines
2.5 KiB
Python

"""Diagnose: when the ITALIC run's fid is used, does the engine emit an ITALIC fallback (Carlito-
Italic)? Rules out an engine style-derivation bug vs. a frontend mis-tagging issue.
Run: gateway/.venv/Scripts/python.exe tests/edits/_italic_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(), "")
italic_fid = None; para = None; pageno = 0
for pg in range(doc.page_count):
m = doc.get_page(pg).extract_document_model()
for p in m.paragraphs:
for ln in p.lines:
for r in ln.runs:
if "italic" in (r.internal_font_id or "").lower() and r.text.strip():
italic_fid = r.internal_font_id; para = p; pageno = pg; break
if italic_fid: break
if italic_fid: break
if italic_fid: break
if not italic_fid:
print("no italic run found"); return
print("italic fid:", italic_fid)
print("para:", ptext(para)[:80])
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)
op = {"version": "1.0", "operations": [{"id": "i", "type": "reflow_paragraph", "pageIndex": pageno, "data": {
"objectIndices": oi, "runs": [{"text": "Mar 2023 Present Zephyr xyzk | the quux",
"internalFontId": italic_fid, "fontSize": 11.0, "color": "#1a5276"}],
"columnLeft": cl, "columnRight": cr, "firstBaselineY": fb, "leading": 13.0,
"oldLineCount": len(para.lines), "align": "left", "paraId": "ITALCHK"}}]}
doc.apply_edits(json.dumps(op))
r = pdfengine.PdfDocument.load_from_memory(doc.save_full(), "")
names = set()
for pg in range(r.page_count):
for p in r.get_page(pg).extract_document_model().paragraphs:
if "Zephyr" in ptext(p):
for ln in p.lines:
for rr in ln.runs:
if rr.text.strip(): names.add(rr.font_name or "")
print("emitted fonts:", sorted(names))
print("=> italic fallback used:", any("italic" in n.lower() for n in names))
if __name__ == "__main__":
main()