在 Python 中將簡報投影片轉換為影像

簡介

Aspose.Slides for Python via Java 能夠將 PowerPoint 與 OpenDocument 簡報的單張投影片轉換為 PNG、JPEG、GIF、TIFF 等圖像格式。

  1. 使用 Presentation 類別載入簡報。
  2. 選取要渲染的投影片。
  3. 如有需要,使用 RenderingOptionsTiffOptions 類別設定渲染參數。
  4. 呼叫 Slide.getImage 方法,該方法會回傳影像物件。
  5. 儲存影像,並使用 ImageFormat 指定輸出格式。

將投影片轉換為 PNG 影像

最簡單的轉換使用預設的渲染設定。產生的影像物件可以在記憶體中處理或儲存為檔案。

以下 Python 範例會渲染第一張投影片,並將其儲存為 PNG 影像:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ImageFormat, Presentation

presentation = Presentation("Presentation.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    image = slide.getImage()
    try:
        image.save("Slide_0.png", ImageFormat.Png)
    finally:
        image.dispose()
finally:
    presentation.dispose()

使用自訂尺寸將投影片轉換為影像

使用接受 Dimension 參數的 Slide.getImage 重載,以精確的像素尺寸渲染投影片。

以下範例會建立一個 1820 × 1040 的 JPEG 影像:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ImageFormat, Presentation
from java.awt import Dimension

image_size = Dimension(1820, 1040)

presentation = Presentation("Presentation.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    image = slide.getImage(image_size)
    try:
        image.save("Slide_0.jpg", ImageFormat.Jpeg)
    finally:
        image.dispose()
finally:
    presentation.dispose()

將含備註與評論的投影片轉換為影像

預設情況下,投影片影像不會包含備註或評論。可將 NotesCommentsLayoutingOptions 物件傳遞給 RenderingOptions.setSlidesLayoutOptions 方法,以控制備註與評論的顯示位置。

以下範例會將截斷的備註放在投影片下方,評論則放在右側:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import CommentsPositions, ImageFormat, NotesCommentsLayoutingOptions, NotesPositions, Presentation, RenderingOptions
from java.awt import Color

scale_x = 2.0
scale_y = scale_x

comments_area_color = Color(250, 235, 215)

layout_options = NotesCommentsLayoutingOptions()
layout_options.setNotesPosition(NotesPositions.BottomTruncated)
layout_options.setCommentsPosition(CommentsPositions.Right)
layout_options.setCommentsAreaWidth(500)
layout_options.setCommentsAreaColor(comments_area_color)

rendering_options = RenderingOptions()
rendering_options.setSlidesLayoutOptions(layout_options)

presentation = Presentation("Presentation_with_notes_and_comments.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    image = slide.getImage(rendering_options, scale_x, scale_y)
    try:
        image.save("Image_with_notes_and_comments_0.gif", ImageFormat.Gif)
    finally:
        image.dispose()
finally:
    presentation.dispose()

使用 TIFF 選項將投影片轉換為影像

TiffOptions 類別可讓您控制渲染出的 TIFF 影像的尺寸、解析度及其他屬性。

以下範例會以 300 DPI 渲染第一張投影片為 2160 × 2880 的 TIFF 影像:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ImageFormat, Presentation, TiffOptions
from java.awt import Dimension

image_size = Dimension(2160, 2880)

tiff_options = TiffOptions()
tiff_options.setImageSize(image_size)
tiff_options.setDpiX(300)
tiff_options.setDpiY(300)

presentation = Presentation("sample.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    image = slide.getImage(tiff_options)
    try:
        image.save("output.tiff", ImageFormat.Tiff)
    finally:
        image.dispose()
finally:
    presentation.dispose()

將全部投影片轉換為影像

遍歷投影片集合即可將整個簡報轉換為一系列影像。若未特別略過,隱藏的投影片也會被包含。

以下範例會以水平與垂直 2 倍的比例因子,將每張投影片渲染為 JPEG 影像:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ImageFormat, Presentation

scale_x = 2.0
scale_y = scale_x

presentation = Presentation("Presentation.pptx")
try:
    slide_count = presentation.getSlides().size()
    for index in range(slide_count):
        slide = presentation.getSlides().get_Item(index)
        image = slide.getImage(scale_x, scale_y)
        try:
            image.save(f"Slide_{index}.jpg", ImageFormat.Jpeg)
        finally:
            image.dispose()
finally:
    presentation.dispose()

建立增強型中繼檔 (EMF) 輸出

增強型中繼檔 (EMF) 在必須將向量圖形與 Microsoft Office 或其他支援 Windows 中繼檔的 Windows 應用程式交換時非常有用。與像素圖像不同,EMF 能保留向量繪圖操作,縮放時不會出現相同的銳利度損失。然而,EMF 主要是針對支援 Windows 中繼檔的應用程式的相容性格式,而非通用的交換格式。另外,複雜的投影片內容(例如點陣圖影像和某些特效)可能會在向量中繼檔容器內以光柵化元素儲存。

將投影片匯出為 EMF

Slide.writeAsEmf 方法會將 Slide 以 EMF 格式寫入目標串流。以下範例會載入簡報、選取第一張投影片,並將其寫入 EMF 檔案串流:

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:
    slide = presentation.getSlides().get_Item(0)

    emf_stream = FileOutputStream("Slide_0.emf")
    try:
        slide.writeAsEmf(emf_stream)
    finally:
        emf_stream.close()
finally:
    presentation.dispose()

如上所示,呼叫端負責管理傳遞給 Slide.writeAsEmf 的串流,並在使用完畢後關閉它。

將 SVG 影像轉換為 EMF 並加入簡報

使用 SvgImage.writeAsEmf 可將 SVG 內容轉換為 EMF。產生的位元組可透過 ImageCollection.addImage 加入簡報,並使用 ShapeCollection.addPictureFrame 置於投影片上。

以下範例會從 SVG 標記建立 SvgImage,將其轉換為記憶體中的 EMF,插入第一張投影片,最後儲存簡報:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ShapeType, SvgImage
from java.io import ByteArrayOutputStream

svg_content = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"100\"><rect width=\"200\" height=\"100\" fill=\"#4472C4\"/></svg>"
svg_image = SvgImage(svg_content)

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    emf_stream = ByteArrayOutputStream()
    try:
        svg_image.writeAsEmf(emf_stream)

        emf_data = emf_stream.toByteArray()
        image = presentation.getImages().addImage(emf_data)
        slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 200, 100, image)
    finally:
        emf_stream.close()

    presentation.save("Presentation_with_emf.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

SvgImage.writeAsEmf 不會取得目標串流的所有權。ByteArrayOutputStream 會將所有產生的資料儲存於記憶體中,因此在呼叫 ByteArrayOutputStream.toByteArray 前不需重設位置。即使串流已關閉,回傳的位元組陣列仍然有效。

EMF 產生取決於所選擇的 Aspose.Slides for Python via Java 及 JDK 配置所支援的作業系統,但若缺少字型或圖形相依性,跨平台的渲染結果可能會不同。請安裝來源內容使用的字型或設定適當的替代字型,遵循 Aspose.Slides for Python via Java 的平台需求,並在目標 EMF 應用程式中驗證結果。Linux 與 macOS 應用程式對 Windows 中繼檔的顯示與編輯支援常常有限或不一致。

彩色 Emoji 渲染

常見問題

Aspose.Slides 是否支援渲染包含動畫的投影片?

否。Slide.getImage 方法僅會渲染投影片的靜態影像,並不會匯出動畫。

隱藏的投影片可以匯出為影像嗎?

可以。隱藏的投影片可像一般投影片一樣渲染。請在處理迴圈中包含它們,如上述範例所示。

投影片影像會保留陰影與其他效果嗎?

會。Aspose.Slides 會在投影片影像中呈現陰影、透明度以及其他支援的圖形效果。