在 Python via Java 中將 PowerPoint 簡報轉換為 Word 文件
概述
本文說明如何使用 Aspose.Slides for Python via Java 搭配 Aspose.Words for Java,將 PowerPoint 與 OpenDocument 投影片轉換為 Word 文件。Aspose.Slides 會渲染每張投影片並讀取其文字,而 Aspose.Words 透過 JPype 建立 Word 文件。無需安裝 Microsoft Office。
產生的文件會先放置投影片影像,然後接著放置從該投影片之頂層自動形狀擷取的可編輯文字。影像保留投影片的視覺外觀;單獨的形狀、圖表與表格不會轉換成可編輯的 Word 物件。擷取的文字不會保留原始的文字格式或位置。
將 PowerPoint 轉換為 Word
- 安裝 Aspose.Slides for Python via Java 並安裝相容的 Java 執行環境。
- 下載 Aspose.Words for Java。將其主要 JAR 檔案放在腳本旁的
lib目錄中,並重新命名為aspose-words.jar,或自行調整範例中的路徑以符合下載的檔案。 - 將輸入投影片
sample.pptx放置於工作目錄中。lib/aspose-words.jar的路徑亦相對於該目錄。 - 執行以下 Python 程式碼以建立
output.docx。
範例使用 Presentation 讀取來源,並以 Slide.getImage 進行投影片渲染。接著使用 Aspose.Words 的 DocumentBuilder 將影像與文字插入 Word 文件。
from pathlib import Path
import jpype
import asposeslides
words_jar = Path("lib/aspose-words.jar").resolve()
jpype.addClassPath(str(words_jar))
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import AutoShape, ImageFormat, Presentation
ByteArrayOutputStream = jpype.JClass("java.io.ByteArrayOutputStream")
Document = jpype.JClass("com.aspose.words.Document")
DocumentBuilder = jpype.JClass("com.aspose.words.DocumentBuilder")
BreakType = jpype.JClass("com.aspose.words.BreakType")
presentation = Presentation("sample.pptx")
try:
document = Document()
builder = DocumentBuilder(document)
page_setup = builder.getPageSetup()
content_width = page_setup.getPageWidth() - page_setup.getLeftMargin() - page_setup.getRightMargin()
slide_size = presentation.getSlideSize().getSize()
image_height = content_width * slide_size.getHeight() / slide_size.getWidth()
slide_count = presentation.getSlides().size()
for slide_index in range(slide_count):
if slide_index > 0:
builder.insertBreak(BreakType.PAGE_BREAK)
slide = presentation.getSlides().get_Item(slide_index)
image = slide.getImage(1.0, 1.0)
try:
image_stream = ByteArrayOutputStream()
try:
image.save(image_stream, ImageFormat.Png)
image_bytes = image_stream.toByteArray()
finally:
image_stream.close()
finally:
image.dispose()
# 將投影片影像調整至文字區域的寬度,保持其長寬比。
builder.insertImage(image_bytes, content_width, image_height)
builder.writeln()
# 將頂層自動形狀(含文字方塊)的純文字附加。
for shape in slide.getShapes():
if isinstance(shape, AutoShape):
text_frame = shape.getTextFrame()
if text_frame is not None:
text = str(text_frame.getText())
if text.strip():
builder.writeln(text)
document.save("output.docx")
finally:
presentation.dispose()
每張投影片會從新的一頁開始。過長的擷取文字或異常高的投影片影像可能需要額外的頁面。程式碼僅在投影片之間加入分頁符,並在 finally 區塊中釋放投影片與渲染的影像。JVM 會在同一個 Python 行程中保持可供後續轉換使用。
常見問題
需要哪些函式庫?
使用 Aspose.Slides for Python via Java、JPype、相容的 Java 執行環境,以及 Aspose.Words for Java。兩個 Aspose 函式庫都在同一個 JVM 中執行。Aspose.Slides 處理投影片,Aspose.Words 負責寫入 Word 文件。
除了 PPTX,還可以轉換 PPT 與 ODP 檔案嗎?
可以。將 sample.pptx 替換為 PPT 或 ODP 檔案。請參閱 Supported File Formats 了解投影片的輸入格式支援情況。
所有投影片內容都能在 Word 中編輯嗎?
不能。每張投影片皆以靜態影像插入,並在下方加入頂層自動形狀的純文字。群組內、表格、SmartArt、圖表以及投影片備註中的文字不會被此範例擷取。動畫與過場效果亦不會在 Word 文件中重現。
可以儲存為 DOC 而不是 DOCX 嗎?
可以。將輸出檔名改為 output.doc 即可。使用此儲存重載時,Aspose.Words 會根據檔案副檔名自動選擇輸出格式。