# Report PDF nel pacchetto Windows Questa cartella contiene quello che serve perché i report PDF di TieMeasureFlow (`src/backend/services/report_service.py`: Jinja2, Plotly con Kaleido 1.2.0, WeasyPrint 68.1) funzionino su Windows, dentro il pacchetto, **senza Internet**. Riferimento: TieMeasureFlow#78 (parte del pacchetto Windows, madre #76). ## Come funziona Un report SPC passa da due componenti nativi che su Windows non arrivano con `pip`: 1. **WeasyPrint** disegna il PDF e carica a runtime le DLL di Pango/GTK (`libgobject-2.0-0`, `libpango-1.0-0`, `libharfbuzz-0`, `libharfbuzz-subset-0`, `libfontconfig-1`, `libpangoft2-1.0-0` e le loro dipendenze). 2. **Kaleido 1.x** trasforma i grafici Plotly in SVG pilotando un browser Chromium già installato (non porta più Chromium con sé). Su ogni Windows 10/11 c'è Edge. ### Le DLL: `prendi-gtk.ps1` ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File packaging\windows\pdf\prendi-gtk.ps1 -Destinazione ``` - Scarica da `repo.msys2.org` (ucrt64) 21 pacchetti **pinnati con sha256** (nome file e hash stanno nello script), verifica l'hash, estrae solo le 27 DLL necessarie, `etc\fonts` di fontconfig e le licenze. - Idempotente: se la cartella è già pronta (file `.gtk-pin` uguale ai pin dello script) esce subito. - Se un hash non coincide fallisce e non lascia mezza cartella. - I pacchetti scaricati stanno in `%LOCALAPPDATA%\Tielogic\tmf-gtk-cache` (`-Cache` per cambiarla). - Serve Internet **solo alla build**. Estrae `.zst` con `tar.exe` di Windows (verificato: bsdtar 3.8.9 con zstd); se `tar.exe` non sa di zstd ripiega su `uv run --with zstandard`. - Gira da utente non admin con PowerShell 5.1. - ⚠️ `repo.msys2.org` tiene solo le versioni recenti: se un file pinnato sparisce (404) vanno aggiornati nome e sha256 dal db `https://repo.msys2.org/mingw/ucrt64/ucrt64.db` e rifatto il test. Conservare la cache (Wasabi o NAS) evita la corsa contro il repository. Il piano C copia `` in `P\gtk\` (P = cartella programma). ### Variabili d'ambiente (le imposta `avvio.py`, piano C) | Variabile | Valore | Perché | |---|---|---| | `WEASYPRINT_DLL_DIRECTORIES` | `

\gtk` | WeasyPrint chiama `os.add_dll_directory` su ogni cartella (separatore `;`) **prima** di caricare le DLL. Va impostata prima di importare `weasyprint` (lo fa `report_service` all'import). | | `BROWSER_PATH` | `msedge.exe` o `chrome.exe` | Choreographer (sotto Kaleido) la legge da sé e ha la precedenza su ogni ricerca (verificato: un percorso inesistente dà `FileNotFoundError`). Senza la variabile Kaleido cerca Edge/Chrome da solo (registro e percorsi tipici). Nessun codice in `report_service.py` per questo. | Fontconfig non richiede variabili: trova `etc\fonts` accanto alle DLL (verificato). Se manca `etc\fonts` WeasyPrint stampa "Fontconfig error: Cannot load default config file". I font dei report vengono da `C:\Windows\Fonts`. ### MathJax: la modifica a `report_service.py` Kaleido 1.x inserisce nella pagina di render uno `