แสดงสไลด์งานนำเสนอเป็นภาพ SVG ใน Python ผ่าน Java
ภาพรวม
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()
กำหนด ID ที่คงที่ให้กับรูปร่างและข้อความ
ใช้คอนโทรลเลอร์การจัดรูปแบบ Python ที่ลงทะเบียนผ่าน jpype.JProxy เพื่อกำหนดค่าให้กับ SvgShape.setId ของรูปร่างและ SvgTSpan.setId ขององค์ประกอบข้อความ tspan. กำหนดพร็อกซีด้วย SVGOptions.setShapeFormattingController.
คอนโทรลเลอร์ต่อไปนี้ใช้ Shape.getOfficeInteropShapeId ซึ่งคงที่ตลอดอายุของรูปร่าง, และตัวนับที่ทำซ้ำได้สำหรับสเปนข้อความของมัน. วิธีนี้ทำให้ ID ที่สร้างขึ้นเหมาะสำหรับการประมวลผลต่อไปของงานนำเสนอที่ไม่ได้เปลี่ยนแปลง.
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
ในคอนโทรลเลอร์การจัดรูปแบบ Python, เรียก SvgShape.setEventHandler พร้อมค่าจาก SvgEvent เพื่อเพิ่มตัวจัดการเหตุการณ์ JavaScript ให้กับรูปร่างที่ส่งออก. ลงทะเบียนคอนโทรลเลอร์ผ่าน jpype.JProxy และกำหนดด้วย SVGOptions.setShapeFormattingController. นิยามฟังก์ชัน JavaScript ในหน้าเว็บหรือเอกสาร 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()
หน้าโฮสต์สามารถนิยามฟังก์ชัน JavaScript ที่ตัวจัดการอ้างอิงได้. การกำหนด ID และตัวจัดการเหตุการณ์ทำให้ผู้ดูสไลด์, การปรับปรุงการเข้าถึง, และเวิร์กโฟลว์ SVG แบบโต้ตอบอื่นๆ ทำงานได้.
คำถามที่พบบ่อย
เมื่อไหร่ควรใช้ SVGOptions.setVectorizeText แทน SvgExternalFontsHandling.Vectorize?
ใช้ SVGOptions.setVectorizeText เมื่อต้องการให้ข้อความทั้งหมดไม่ได้พึ่งพาแบบอักษร. ใช้ SvgExternalFontsHandling.Vectorize เมื่อต้องการแปลงเป็นกราฟิกเฉพาะข้อความที่ใช้แบบอักษรภายนอกเท่านั้น.
วิธีที่ดีที่สุดในการทำให้ SVG มีขนาดเล็กลงคืออะไร?
เริ่มต้นด้วยการบีบอัดรูปภาพที่ฝัง, ลบพื้นที่ภาพที่ถูกครอบ, และเลือกใช้ไฟล์แบบอักษรที่เชื่อมโยงเมื่อสภาพแวดล้อมเป้าหมายสามารถให้บริการได้. ทดสอบผลลัพธ์เนื่องจากการลดความละเอียดของภาพ, การลดคุณภาพ JPEG, และการแปลงเป็นเวกเตอร์มีผลต่อคุณภาพและขนาดที่ต่างกัน.
ฉันสามารถแก้ไของค์ประกอบ SVG ที่ส่งออกหลังการส่งออกได้หรือไม่?
ได้. กำหนด ID ผ่านคอนโทรลเลอร์การจัดรูปแบบ, จากนั้นเลือกองค์ประกอบ SVG ที่ตรงกันในเครื่องมือประมวลผลต่อหรือสคริปต์เบราว์เซอร์ของคุณ.