在 Python 中將簡報投影片轉換為影像
簡介
Aspose.Slides for Python via Java 能夠將 PowerPoint 與 OpenDocument 簡報的單張投影片轉換為 PNG、JPEG、GIF、TIFF 等圖像格式。
- 使用 Presentation 類別載入簡報。
- 選取要渲染的投影片。
- 如有需要,使用 RenderingOptions 或 TiffOptions 類別設定渲染參數。
- 呼叫 Slide.getImage 方法,該方法會回傳影像物件。
- 儲存影像,並使用 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()
警告
在投影片轉影像的過程中,請勿將 BottomFull 傳遞給 NotesCommentsLayoutingOptions.setNotesPosition 方法。備註的文字可能超過固定影像尺寸的容納範圍,請改用 BottomTruncated。使用 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()
警告
在 JDK 9 之前的 Java 版本中,無法保證支援 TIFF。將全部投影片轉換為影像
遍歷投影片集合即可將整個簡報轉換為一系列影像。若未特別略過,隱藏的投影片也會被包含。
以下範例會以水平與垂直 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 渲染
注意
在將簡報投影片轉換為影像時,若要正確呈現彩色 emoji,必須在執行轉換的系統上安裝簡報中使用的 emoji 字型。例如,若簡報使用 Segoe UI Emoji 且該字型缺失,輸出影像中的 emoji 可能會以單色顯示。常見問題
Aspose.Slides 是否支援渲染包含動畫的投影片?
否。Slide.getImage 方法僅會渲染投影片的靜態影像,並不會匯出動畫。
隱藏的投影片可以匯出為影像嗎?
可以。隱藏的投影片可像一般投影片一樣渲染。請在處理迴圈中包含它們,如上述範例所示。
投影片影像會保留陰影與其他效果嗎?
會。Aspose.Slides 會在投影片影像中呈現陰影、透明度以及其他支援的圖形效果。