# ZipBundler versione 1.0

ZipBundler e un piccolo tool desktop per creare piu archivi ZIP indipendenti a partire da una cartella sorgente, mantenendo ogni pacchetto entro una dimensione massima configurabile.

L'obiettivo pratico e preparare allegati gestibili per invio tramite posta elettronica aziendale, dove spesso il limite reale degli allegati e vicino a 20-25 MB.

## Funzioni principali

- Scelta della cartella sorgente.
- Scelta della cartella di destinazione.
- Dimensione massima dei pacchetti tramite spinbox.
- Default a 15 MB, piu prudente per l'invio email.
- Avviso inline sopra 18 MB, con richiesta di accettazione esplicita.
- Creazione di pacchetti `pacchetto_001.zip`, `pacchetto_002.zip`, ecc.
- Verifica della dimensione reale dello ZIP finale, non della somma dei file originali.
- Ottimizzazione guidata di PDF troppo grandi.
- Ottimizzazione guidata di immagini troppo grandi.
- Opzione esplicita per convertire formati immagine non compressi in JPEG.
- Opzione esplicita per convertire file Office grandi in PDF.

## Scelta fondamentale sulla dimensione

La dimensione limite viene controllata sul file `.zip` finale.

Questo e importante perche la dimensione dei file originali non coincide con la dimensione dell'archivio compresso. Il programma crea ZIP temporanei di prova, misura il risultato reale e solo dopo decide se un file puo entrare nel pacchetto corrente.

## PDF troppo grandi

Quando un PDF supera da solo il limite impostato, ZipBundler prova diversi approcci:

1. Ottimizzazione interna senza perdita tramite PyMuPDF.
2. Compressione tramite Ghostscript, se disponibile nel sistema.
3. Ricodifica a immagini/DPI ridotti solo per PDF che non sembrano contenere testo selezionabile significativo.

La ricodifica raster dei PDF nativi e evitata quando possibile, perche puo aumentare la dimensione e far perdere testo selezionabile.

Se viene creata una copia ridotta, l'originale non viene modificato. La copia viene salvata nella cartella di destinazione, dentro `_pdf_ridotti_email`.

Nella GUI viene mostrata una preview affiancata originale/ridotto, con navigazione delle pagine.

## Ghostscript

Ghostscript e usato come motore preferenziale per ridurre PDF nativi quando e disponibile.

Il programma cerca:

- `gswin64c`
- `gswin32c`
- `gs`

Se Ghostscript non e presente, il programma salta quel passaggio e continua con le altre strategie.

## Immagini troppo grandi

Per le immagini viene usata Pillow.

Formati supportati:

- JPG/JPEG
- PNG
- TIFF/TIF
- BMP
- WEBP

Profili:

- qualita alta: lato lungo massimo 2500 px
- qualita email: lato lungo massimo 1800 px
- massima compressione: lato lungo massimo 1200 px

Per impostazione predefinita il formato originale viene mantenuto. Per esempio un TIFF ridotto resta TIFF.

Esiste pero una checkbox esplicita:

`Converti formati non compressi in JPEG (es. BMP/TIFF)`

Solo se questa opzione e attiva, BMP e TIFF vengono convertiti in JPEG per ottenere file molto piu leggeri.

Le copie ridotte vengono salvate in `_immagini_ridotte_email`.

## File Office troppo grandi

ZipBundler puo convertire file Office grandi in PDF, ma solo se la checkbox dedicata e attiva:

`Converti file Office grandi in PDF (es. DOCX -> PDF)`

Formati previsti:

- DOC/DOCX
- XLS/XLSX
- PPT/PPTX

La conversione usa Microsoft Office tramite automazione COM (`win32com`). Quindi richiede Office installato e funzionante sul PC.

Le copie PDF vengono salvate in `_office_convertiti_pdf`.

LibreOffice headless e stato valutato come opzione futura, ma non e incluso per evitare di aumentare molto il peso di un eventuale eseguibile PyInstaller.

## Scelte conservative

- Gli originali non vengono mai modificati.
- Le conversioni di formato sono disattivate di default.
- Una copia ottimizzata viene accettata solo se riduce davvero il file e permette allo ZIP finale di rientrare nel limite.
- Sopra 18 MB viene richiesto consenso esplicito, perche la codifica email puo aumentare la dimensione effettiva del messaggio.
- Se un file non puo essere ridotto sotto soglia, viene segnalato e inserito in un pacchetto fuori limite.

## Uso GUI

```powershell
python .\zipbundler.py
```

## Uso CLI

```powershell
python .\zipbundler.py C:\percorso\cartella --output C:\percorso\output --size-mb 15
```

Opzioni:

```powershell
--convert-uncompressed-images
--convert-office-to-pdf
```

## Dipendenze Python

```powershell
pip install -r requirements.txt
```

Dipendenze principali:

- CustomTkinter
- Pillow
- PyMuPDF

Per Office COM serve anche `pywin32`, installato nell'ambiente in cui viene eseguito il programma.

## Packaging futuro

Il progetto e pensato per essere trasformato in un eseguibile Windows con PyInstaller.

Script disponibile:

```powershell
.\build_exe.ps1 -Clean
```

Lo script:

- installa le dipendenze Python;
- installa/aggiorna PyInstaller;
- include lo splash screen `assets/splash.png`;
- crea un eseguibile Windows `dist\ZipBundler.exe`;
- prova a includere Ghostscript se trova `gswin64c`, `gswin32c` o `gs` nel PATH.

Lo splash screen riporta `ZipBundler`, `versione 1.0` e `ai.teamstudio.it`.

Componenti inclusi o gestiti:

- CustomTkinter, Pillow e PyMuPDF vengono inclusi da PyInstaller come dipendenze Python;
- Ghostscript viene incluso se rilevato in fase di build;
- Microsoft Office non viene incluso: la conversione Office -> PDF usa Office COM e richiede Office installato sul PC di destinazione.

Da valutare in futuro:

- gestione piu esplicita di `pywin32`;
- eventuale icona applicativa;
- firma dell'eseguibile, se necessaria in ambiente aziendale.
