61 lines
2.5 KiB
Python
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() |