تصدير شرائح العرض التقديمي كصور SVG في بايثون عبر جافا
نظرة عامة
SVG هو تنسيق صورة قائم على XML قابل للتوسيع يعمل بشكل جيد للنشر على الويب، وعارض الشرائح، وسير عمل الوصول، والمعالجة التلقائية بعد الإنشاء. تقوم Aspose.Slides بتصدير كل شريحة إلى ملف SVG منفصل وتتيح لك التحكم في كيفية كتابة النصوص، الخطوط، الصور، وعناصر SVG.
استخدم SVGOptions عندما يجب أن يكون SVG المُصدَّر مضغوطًا، متوقعًا عبر المتصفحات، أو جاهزًا للاستخدام التفاعلي.
تصدير شريحة كـ SVG
أنشئ Presentation، حدد شريحة، واكتبها إلى تدفق باستخدام Slide.writeAsSvg. تتطلب الأمثلة وجود ملف presentation.pptx موجود. كل مثال يبدأ الـ JVM إذا لزم الأمر ويغلق تدفقات الخرج الخاصة به. المثال التالي يصدر كل شريحة في عرض تقديمي إلى ملف SVG منفصل.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
from java.io import FileOutputStream
presentation = Presentation("presentation.pptx")
try:
for slide in presentation.getSlides():
output_file_name = f"slide-{slide.getSlideNumber()}.svg"
svg_stream = FileOutputStream(output_file_name)
try:
slide.writeAsSvg(svg_stream)
finally:
svg_stream.close()
finally:
presentation.dispose()
يستخدم اسم الملف Slide.getSlideNumber بدلاً من فهرس الحلقة. يمكنك أيضًا تصدير شكل فردي باستخدام Shape.writeAsSvg عندما يحتاج عارض الشرائح أو صفحة الويب إلى ذلك الشكل فقط.
تكوين إخراج SVG
SVGOptions يتحكم في عرض SVG. بالنسبة لإطارات النص، SVGOptions.setUseFrameSize يضم إطار النص في منطقة العرض، وSVGOptions.setUseFrameRotation يحدد ما إذا كان يتم تطبيق دوران الإطار. اضبط SVGOptions.setDisableFontLigatures إلى True عندما يجب عرض النص بدون أربطة الخط.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SVGOptions
from java.io import FileOutputStream
presentation = Presentation("presentation.pptx")
try:
svg_options = SVGOptions()
svg_options.setDisableFontLigatures(True)
svg_options.setUseFrameSize(True)
svg_options.setUseFrameRotation(False)
slide = presentation.getSlides().get_Item(0)
svg_stream = FileOutputStream("slide-with-custom-options.svg")
try:
slide.writeAsSvg(svg_stream, svg_options)
finally:
svg_stream.close()
finally:
presentation.dispose()
التحكم في النص والخطوط
تحويل كل النص إلى رسومات متجهة
اضبط SVGOptions.setVectorizeText إلى True لكتابة كل نص الشريحة كرسومات متجهة. هذا يلغي الاعتماد على الخطوط ويجعل النتيجة البصرية أكثر اتساقًا عبر المتصفحات، لكن النص لم يعد قابلًا للتحديد أو البحث كالنص SVG.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SVGOptions
from java.io import FileOutputStream
presentation = Presentation("presentation.pptx")
try:
svg_options = SVGOptions()
svg_options.setVectorizeText(True)
slide = presentation.getSlides().get_Item(0)
svg_stream = FileOutputStream("slide-with-vectorized-text.svg")
try:
slide.writeAsSvg(svg_stream, svg_options)
finally:
svg_stream.close()
finally:
presentation.dispose()
اختر طريقة معالجة الخطوط الخارجية
SVGOptions.setExternalFontsHandling يستخدم قيمة SvgExternalFontsHandling للخطوط التي يتم تحميلها خارجيًا. اختر AddLinksToFontFiles للإشارة إلى ملفات خطوط منفصلة، Embed لتضمين بيانات الخط داخل SVG، أو Vectorize لعرض النص الذي يستخدم الخطوط الخارجية كرسومات فقط. تحقق من ترخيص الخط قبل تضمين الخطوط.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SVGOptions, SvgExternalFontsHandling
from java.io import FileOutputStream
presentation = Presentation("presentation.pptx")
try:
slide = presentation.getSlides().get_Item(0)
font_modes = [
("slide-with-font-links.svg", SvgExternalFontsHandling.AddLinksToFontFiles),
("slide-with-embedded-fonts.svg", SvgExternalFontsHandling.Embed),
("slide-with-vectorized-external-fonts.svg", SvgExternalFontsHandling.Vectorize),
]
for output_file_name, font_mode in font_modes:
svg_options = SVGOptions()
svg_options.setExternalFontsHandling(font_mode)
svg_stream = FileOutputStream(output_file_name)
try:
slide.writeAsSvg(svg_stream, svg_options)
finally:
svg_stream.close()
finally:
presentation.dispose()
تقليل حجم الصور المضمنة
استخدم SVGOptions.setPicturesCompression لتقليل دقة الصور المضمنة، وSVGOptions.setDeletePicturesCroppedAreas لحذف المناطق المقتطفة من المصدر، وSVGOptions.setJpegQuality للتحكم في جودة ترميز JPEG. هذه الإعدادات تقلل حجم الملف على حساب دقة الصورة أو احتفاظ ببيانات الصورة.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import PicturesCompression, Presentation, SVGOptions
from java.io import FileOutputStream
presentation = Presentation("presentation.pptx")
try:
svg_options = SVGOptions()
svg_options.setPicturesCompression(PicturesCompression.Dpi150)
svg_options.setDeletePicturesCroppedAreas(True)
svg_options.setJpegQuality(80)
slide = presentation.getSlides().get_Item(0)
svg_stream = FileOutputStream("compressed-slide.svg")
try:
slide.writeAsSvg(svg_stream, svg_options)
finally:
svg_stream.close()
finally:
presentation.dispose()
تعيين معرفات ثابتة للأشكال والنص
استخدم وحدة تحكم تنسيق بايثون مسجلة عبر jpype.JProxy لتعيين قيم SvgShape.setId إلى الأشكال و قيم SvgTSpan.setId إلى عناصر النص tspan. عيّن الوكيل باستخدام SVGOptions.setShapeFormattingController.
المتحكم التالي يستخدم Shape.getOfficeInteropShapeId، وهو ثابت طوال عمر الشكل، ومضounter قابل للتكرار للـ text spans الخاصة به. هذا يجعل المعرفات المُولدة مناسبة للمعالجة اللاحقة لعرض تقديمي غير متغيّر.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SVGOptions
from java.io import FileOutputStream
class StableSvgIdController:
def __init__(self):
self.current_shape_id = ""
self.text_span_index = 0
def formatShape(self, svg_shape, shape):
self.current_shape_id = f"shape-{shape.getOfficeInteropShapeId()}"
self.text_span_index = 0
svg_shape.setId(self.current_shape_id)
def formatText(self, svg_tspan, portion, text_frame):
svg_tspan.setId(f"{self.current_shape_id}-text-{self.text_span_index}")
self.text_span_index += 1
presentation = Presentation("presentation.pptx")
try:
controller = StableSvgIdController()
proxy = jpype.JProxy("com.aspose.slides.ISvgShapeAndTextFormattingController", inst=controller)
svg_options = SVGOptions()
svg_options.setShapeFormattingController(proxy)
slide = presentation.getSlides().get_Item(0)
svg_stream = FileOutputStream("slide-with-stable-ids.svg")
try:
slide.writeAsSvg(svg_stream, svg_options)
finally:
svg_stream.close()
finally:
presentation.dispose()
إضافة معالجات أحداث SVG
في وحدة تحكم تنسيق بايثون، استدعِ SvgShape.setEventHandler مع قيمة SvgEvent لإضافة معالج حدث جافاسكريبت إلى شكل مُصدَّر. سجل المتحكم عبر jpype.JProxy وعيّنّه باستخدام SVGOptions.setShapeFormattingController. عرّف دالة جافاسكريبت في الصفحة أو مستند SVG الذي يستضيف النتيجة.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SVGOptions, SvgEvent
from java.io import FileOutputStream
class SvgEventController:
def formatShape(self, svg_shape, shape):
if shape.getName() == "ActionButton":
svg_shape.setId("action-button")
svg_shape.setEventHandler(SvgEvent.OnClick, "handleShapeClick(event)")
presentation = Presentation("presentation.pptx")
try:
controller = SvgEventController()
proxy = jpype.JProxy("com.aspose.slides.ISvgShapeFormattingController", inst=controller)
svg_options = SVGOptions()
svg_options.setShapeFormattingController(proxy)
slide = presentation.getSlides().get_Item(0)
svg_stream = FileOutputStream("interactive-slide.svg")
try:
slide.writeAsSvg(svg_stream, svg_options)
finally:
svg_stream.close()
finally:
presentation.dispose()
يمكن للصفحة المستضيفة تعريف دالة جافاسكريبت التي يشير إليها المعالج. تعيين المعرفات ومعالجات الأحداث يتيح لعارضات الشرائح، وتعزيزات الوصول، وغيرها من سير عمل SVG التفاعلية.
الأسئلة الشائعة
متى يجب استخدام SVGOptions.setVectorizeText بدلاً من SvgExternalFontsHandling.Vectorize?
استخدم [SVGOptions.setVectorizeText] عندما يجب أن يكون كل النص مستقلًا عن الخطوط. استخدم [SvgExternalFontsHandling.Vectorize] عندما ينبغي تحويل النص الذي يستخدم خطوطًا خارجية فقط إلى رسومات.
ما هي أفضل طريقة لجعل ملف SVG أصغر؟
ابدأ بضغط الصور المضمنة، حذف المناطق المقتطفة من الصورة، واختيار ملفات خطوط مرتبطة عندما يمكن للبيئة المستهدفة تقديمها. اختبر النتيجة لأن خفض دقة الصورة، خفض جودة JPEG، وتحويل النص إلى رسومات متجهة كل منها يملك مفاضلات مختلفة بين الجودة والحجم.
هل يمكنني تعديل عناصر SVG المُصدَّرة بعد التصدير؟
نعم. عيّن المعرفات عبر وحدة تحكم تنسيق، ثم حدد عناصر SVG المتطابقة في أداة المعالجة اللاحقة أو سكربت المتصفح.