كيفية تشغيل Aspose.Slides في Docker

نظرة عامة

Aspose.Slides for Python via .NET يعمل داخل حاويات لينكس، لكن الحزمة هي غلاف Python حول بيئة تشغيل .NET Core 3.1 مدمجة. هذه البيئة تحتاج إلى ثلاث مكتبات أصلية لا تُدرج في صور Python الخفيفة، وهي حساسة لإصداراتها. يقدّم هذا المقال 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 تحزم بيئة تشغيل .NET Core 3.1، وهذه البيئة أقدم من إصدارات المكتبات الموجودة في إصدارات Debian الحالية. على Debian 12 و13 تُبنى الحاوية بنجاح ثم تفشل عند أول نداء لـ Presentation():

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

الرسالة مضللة — 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، وتوفر كلا الإصدارين اللذين تتوقعهما بيئة التشغيل المدمجة:

Package Version on Debian 11 Why it is needed
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/"])

الترخيص داخل حاوية

لا تُدمج ملف الترخيص داخل الصورة — أي شخص يسحب الصورة يحصل على الترخيص. قم بتحميله عند التشغيل بدلًا من ذلك:

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 أثناء التحويل، وعادةً ما يظهر ذلك كاختفاء العملية دون أثر تتبع في Python. إذا حدث ذلك، ارفع حد الذاكرة للحاوية قبل فحص الشيفرة.