Come eseguire Aspose.Slides in Docker

Panoramica

Aspose.Slides for Python via .NET funziona nei container Linux, ma il pacchetto è un wrapper Python attorno a un runtime .NET Core 3.1 incluso. Questo runtime richiede tre librerie native che le image Python slim non includono, ed è esigente riguardo alle loro versioni. Questo articolo fornisce un Dockerfile che funziona, spiega perché ciascuna dipendenza è presente e mostra come aggiungere font e una licenza.

Un Dockerfile funzionante

FROM python:3.11-slim-bullseye

RUN apt-get update && apt-get install -y --no-install-recommends \
        libgdiplus \
        libicu67 \
        libfontconfig1 \
        fonts-dejavu-core \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir aspose.slides

WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]

app.py:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 400, 100)
    shape.text_frame.text = "Created inside a Docker container"
    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)
    presentation.save("output.pdf", slides.export.SaveFormat.PDF)

Compila ed esegui:

docker build -t aspose-slides-python .
docker run --rm aspose-slides-python

Perché l’immagine di base è Debian 11

Il wheel aspose.slides include un runtime .NET Core 3.1, e quel runtime è antecedente alle versioni delle librerie fornite dalle attuali release di Debian. Su Debian 12 e 13 il container si costruisce correttamente ma poi fallisce alla prima chiamata Presentation():

Process terminated. Couldn't find a valid ICU package installed on the system.

Il messaggio è fuorviante — ICU è installato su quelle immagini, ma è ICU 72 o 76, e .NET Core 3.1 riconosce solo versioni principali più vecchie. Debian 12 inoltre fornisce OpenSSL 3, il che genera un secondo errore:

No usable version of libssl was found

python:3.11-slim-bullseye è Debian 11, che fornisce entrambe le versioni attese dal runtime incluso:

Pacchetto Versione su Debian 11 Perché è necessario
libgdiplus 6.0.4 Implementazione GDI+ usata per il rendering di forme, testo e immagini
libicu67 67.1 Dati di internazionalizzazione. Le versioni principali più recenti non sono riconosciute da .NET Core 3.1
libssl1.1 1.1.1w Crittografia. Preinstallato su Debian 11; assente su Debian 12+
libfontconfig1 Rilevamento dei font

libssl1.1 è già presente nell’immagine di base, quindi non è necessario elencarlo in apt-get install.

Se devi usare un’immagine di base più recente, imposta DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 per aggirare il requisito di ICU. Questo disabilita la formattazione specifica della cultura e non risolve il problema di OpenSSL, quindi Debian 11 rimane la scelta più semplice.

Font

Le immagini slim non contengono affatto font. Senza almeno un font installato, il testo viene visualizzato come riquadri vuoti in PDF, immagini e output HTML. fonts-dejavu-core è un piccolo punto di partenza di uso generale.

Per corrispondere all’aspetto previsto di una presentazione, copia i font che utilizza nell’immagine e indica ad Aspose.Slides di usarli:

COPY fonts/ /usr/share/fonts/truetype/custom/
RUN fc-cache -f
import aspose.slides as slides

slides.FontsLoader.load_external_fonts(["/usr/share/fonts/truetype/custom/"])

Licenze all’interno di un container

Non includere il file di licenza nell’immagine — chiunque scarichi l’immagine otterrà la licenza. Montala invece al momento dell’esecuzione:

docker run --rm -v /path/on/host:/license aspose-slides-python
import aspose.slides as slides

license = slides.License()
license.set_license("/license/Aspose.Slides.Python.NET.lic")

Senza una licenza la libreria funziona in modalità di valutazione, che aggiunge una filigrana e limita il numero di diapositive elaborate. Vedi Licensing per i dettagli.

Memoria

Il rendering in PDF o immagini richiede più memoria rispetto alla lettura di un file. I container con limiti di memoria ristretti possono essere terminati dall’OOM killer a metà di una conversione, il che di solito si manifesta come la scomparsa del processo senza un traceback Python. Se ciò accade, aumenta il limite di memoria del container prima di analizzare il codice.