نحوه اجرا کردن Aspose.Slides در Docker

نمای کلی

Aspose.Slides for Python via .NET در کانتینرهای لینوکس اجرا می‌شود، اما بسته یک wrapper پایتون است که دور یک runtime باندل شده .NET Core 3.1 می‌چرخد. این runtime به سه کتابخانه بومی نیاز دارد که تصاویر لاغر پایتون ارائه نمی‌دهند و نسبت به نسخه‌هایشان حساس است. این مقاله یک Dockerfile کارا ارائه می‌دهد، دلیل وجود هر وابستگی را توضیح می‌دهد و نشان می‌دهد چگونه فونت‌ها و یک لایسنس اضافه شوند.

Dockerfile کاری

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)

ساخت و اجرا:

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

دلیل استفاده از تصویر پایه Debian 11

چرخ aspose.slides یک runtime .NET Core 3.1 را باندل می‌کند و این runtime پیش از نسخه‌های کتابخانه‌ای است که در نسخه‌های فعلی Debian توزیع می‌شوند. در Debian 12 و 13 کانتینر با موفقیت ساخته می‌شود ولی هنگام اولین فراخوانی Presentation() شکست می‌خورد:

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

پیام گمراه‌کننده است — ICU در این تصاویر نصب شده است، اما ICU 72 یا 76 است و .NET Core 3.1 فقط نسخه‌های اصلی قدیمی‌تر را تشخیص می‌دهد. Debian 12 همچنین OpenSSL 3 را تحویل می‌دهد که منجر به شکست دوم می‌شود:

No usable version of libssl was found

python:3.11-slim-bullseye بر پایه Debian 11 است که هر دو نسخه‌ای که runtime باندل شده انتظار دارد را فراهم می‌کند:

Package Version on Debian 11 چرا نیاز است
libgdiplus 6.0.4 پیاده‌سازی GDI+ برای رندر کردن شکل‌ها، متن و تصویر
libicu67 67.1 داده‌های بومی‌سازی. نسخه‌های اصلی جدیدتر توسط .NET Core 3.1 شناسایی نمی‌شوند
libssl1.1 1.1.1w رمزنگاری. در Debian 11 پیش‌نصب است؛ در Debian 12+ وجود ندارد
libfontconfig1 کشف فونت‌ها

libssl1.1 از پیش در تصویر پایه وجود دارد، بنابراین نیازی به افزودن آن به apt-get install نیست.

اگر مجبور به استفاده از تصویر پایه جدیدتر شوید، مقدار DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 را تنظیم کنید تا نیاز به ICU را نادیده بگیرید. این کار قالب‌بندی مبتنی بر فرهنگ را غیرفعال می‌کند و مشکل OpenSSL را حل نمی‌کند، بنابراین Debian 11 همچنان گزینهٔ ساده‌تری است.

فونت‌ها

تصاویر لاغر هیچ فونتی ندارند. بدون حداقل یک فونت نصب‌شده، متن در خروجی PDF، تصویر و HTML به صورت جعبه‌های خالی نمایش داده می‌شود. fonts-dejavu-core یک نقطهٔ شروع عمومی و کوچک است.

برای تطبیق ظاهر نهایی ارائه، فونت‌هایی که آن استفاده می‌کند را درون تصویر کپی کنید و Aspose.Slides را به سمت آن‌ها هدایت کنید:

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/"])

مجوزدهی داخل یک کانتینر

فایل لایسنس را داخل تصویر نبنویسید — هر کسی که تصویر را می‌کشید لایسنس را دریافت می‌کند. به جای آن در زمان اجرا آن را Mount کنید:

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")

بدون لایسنس کتابخانه در حالت ارزیابی اجرا می‌شود که یک واترمارک اضافه می‌کند و تعداد اسلایدهای پردازش‌شده را محدود می‌نماید. برای جزئیات بیشتر به مجوزدهی مراجعه کنید.

حافظه

رندرسازی به PDF یا تصویر نسبت به خواندن فایل حافظه بیشتری مصرف می‌کند. کانتینرهایی با محدودیت حافظه تنگ می‌توانند توسط OOM killer قبل از اتمام تبدیل خاتمه یابند؛ این معمولاً به شکل ناپدید شدن پردازش بدون traceback پایتون ظاهر می‌شود. اگر این رخ داد، قبل از بررسی کد، محدودیت حافظهٔ کانتینر را افزایش دهید.