在Java中編輯PowerPoint?PPTX文檔的操作過程
引言
構(gòu)建用于程序化編輯 Open Office XML(OOXML)文檔(如 PowerPoint、Excel 和 Word)的應(yīng)用程序從未如此簡單。根據(jù)項目范圍,Java 開發(fā)人員可以在代碼中利用開源的第三方庫,或者使用簡化插件的 API 來操作存儲和顯示在 OOXML 結(jié)構(gòu)中的內(nèi)容。
在本文中,我們將專門討論 PowerPoint 演示文稿 XML(PPTX)文件的結(jié)構(gòu),并學(xué)習(xí)如何操作 PPTX 內(nèi)容的基本過程。然后,我們將討論一個流行的開源 Java 庫,用于程序化操作 PPTX 文件(特別是替換文本字符串的實例),并隨后探索一個免費(fèi)的第三方 API 解決方案,該方案可以幫助簡化該過程并減少本地內(nèi)存消耗。
PowerPoint PPTX 文件的結(jié)構(gòu)是怎樣的?
像所有 OOXML 文件一樣,PowerPoint PPTX 文件的結(jié)構(gòu)是包含一系列分層組織的 XML 文件的 ZIP 存檔。它們本質(zhì)上是一系列目錄,其中大部分負(fù)責(zé)存儲和安排我們在 PowerPoint 應(yīng)用程序(或任何 PPTX 文件閱讀器)中看到的資源。
PPTX 存檔從一個基本的根結(jié)構(gòu)開始,其中定義了我們在 PowerPoint 中看到的各種內(nèi)容類型(例如,多媒體內(nèi)容)。PPTX 文檔的核心位于目錄級別,組件如幻燈片(例如,firstSlide.xml、secondSlide.xml 等)、幻燈片布局(例如,模板)、幻燈片母版(例如,全局樣式和占位符)以及其他內(nèi)容(例如,圖表、媒體和主題)被清晰地組織起來。PPTX 文件中相互依賴組件之間的關(guān)系存儲在 _rels
目錄中的 .rels
XML 文件中。當(dāng)對幻燈片或其他內(nèi)容進(jìn)行更改時,這些關(guān)系文件會自動更新。
考慮到這種文件結(jié)構(gòu),假設(shè)我們想在不使用 PowerPoint 或任何其他 PPTX 閱讀器打開文件的情況下手動替換 PowerPoint 幻燈片中的文本字符串。為此,我們首先需要將 PPTX 存檔轉(zhuǎn)換為 ZIP 文件(帶有 .zip
擴(kuò)展名),然后解壓其內(nèi)容。之后,我們將檢查 ppt/presentation.xml
文件,該文件按順序列出幻燈片,然后導(dǎo)航到 ppt/slides/
目錄以找到目標(biāo)幻燈片(例如,secondSlide.xml
)。要修改幻燈片,我們將打開 secondSlide.xml
,找到我們需要的文本運(yùn)行(通常結(jié)構(gòu)為 <a:t> “string” </a:t>
,位于 <a:r></a:r>
標(biāo)簽內(nèi)),并用新字符串替換文本內(nèi)容。然后,我們將檢查 _rels
目錄,以確?;脽羝P(guān)系保持完整;之后,我們將文件重新打包為 ZIP 存檔,并重新引入 .pptx
擴(kuò)展名。
在 Java 中程序化更改 PPTX 文件
要在 Java 中處理完全相同的過程,我們需要根據(jù)上下文考慮幾種不同的可能性。顯然,沒有人愿意臨時將整個 OOXML 結(jié)構(gòu)映射到自定義 Java 程序中——因此,我們需要根據(jù)項目約束確定使用開源庫還是即插即用的 API 服務(wù)是否更有意義。
如果我們選擇開源路線,Apache POI
將是一個不錯的選擇。Apache POI 是一個開源的 Java API,專門設(shè)計用于幫助開發(fā)人員處理 Microsoft 文檔,包括 PowerPoint PPTX(以及 Excel XLSX、Word DOCX 等)。
對于涉及 PPTX 文件的項目,我們首先需要導(dǎo)入適用于 PowerPoint 項目的相關(guān) Apache POI 類(例如,XMLSlideShow
、XSLFSlide
和 XSLFTextShape
)。然后,我們將使用 XMLSlideShow
類加載 PPTX 文件,調(diào)用 getSlides()
方法,使用 XSLFTextShape
類過濾文本內(nèi)容,并調(diào)用 getText()
和 setText()
方法來替換特定字符串。
這將完全可行,但值得注意的是,使用像 Apache POI 這樣的開源庫的挑戰(zhàn)在于內(nèi)存的處理方式。Apache POI 將所有數(shù)據(jù)加載到本地內(nèi)存中,盡管有一些解決方法——例如,增加 JVM 堆大小或?qū)崿F(xiàn)基于流的 API——但我們在處理大規(guī)模的 PPTX 文件時可能會消耗大量資源。
利用第三方 API 解決
如果我們無法在本地處理 PPTX 編輯工作流,那么云 API 解決方案可能會有所幫助。這種解決方案將大部分文件處理工作卸載到外部服務(wù)器,并返回結(jié)果,從而減少開銷。作為額外的好處,它還簡化了構(gòu)建字符串替換請求的過程。我們將查看以下一個 API 解決方案。
以下示例 Java 代碼可用于調(diào)用一個免費(fèi)的 Web API,該 API 可替換 PPTX 文檔中找到的所有字符串實例。該 API 可免費(fèi)使用,并且需要一個免費(fèi)的 API 密鑰,其參數(shù)極其簡單易用。
為了構(gòu)建我們的 API 調(diào)用,我們首先需要將客戶端庫納入我們的 Maven 項目。我們將在 pom.xml
中添加以下(JitPack
)倉庫引用:
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
接下來,我們將在 pom.xml
中添加以下依賴引用:
<dependencies> <dependency> <groupId>com.github.Cloudmersive</groupId> <artifactId>Cloudmersive.APIClient.Java</artifactId> <version>v4.25</version> </dependency> </dependencies>
完成這些后,我們現(xiàn)在將以下導(dǎo)入類復(fù)制并添加到文件頂部:
// Import classes: //import com.cloudmersive.client.invoker.ApiClient; //import com.cloudmersive.client.invoker.ApiException; //import com.cloudmersive.client.invoker.Configuration; //import com.cloudmersive.client.invoker.auth.*; //import com.cloudmersive.client.EditDocumentApi;
現(xiàn)在,我們將使用以下代碼初始化 API 客戶端,然后配置 API 密鑰授權(quán)。setAPIKey()
方法將捕獲我們的 API 密鑰字符串:
ApiClient defaultClient = Configuration.getDefaultApiClient(); // Configure API key authorization: Apikey ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey"); Apikey.setApiKey("YOUR API KEY"); // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) //Apikey.setApiKeyPrefix("Token");
最后,我們將使用以下代碼實例化 API 客戶端,配置替換操作,執(zhí)行替換過程(返回一個 byte[]
數(shù)組),并捕獲/記錄錯誤:
EditDocumentApi apiInstance = new EditDocumentApi(); ReplaceStringRequest reqConfig = new ReplaceStringRequest(); // ReplaceStringRequest | Replacement document configuration input try { byte[] result = apiInstance.editDocumentPptxReplace(reqConfig); System.out.println(result); } catch (ApiException e) { System.err.println("Exception when calling EditDocumentApi#editDocumentPptxReplace"); e.printStackTrace(); }
以下 JSON 定義了我們的請求結(jié)構(gòu);我們將在代碼中使用它來配置字符串替換操作的參數(shù)。
{ "InputFileBytes": "string", "InputFileUrl": "string", "MatchString": "string", "ReplaceString": "string", "MatchCase": true }
我們可以通過將文件讀入一個字節(jié)數(shù)組并將其轉(zhuǎn)換為 Base64 編碼的字符串,為這個 API 請求準(zhǔn)備一個 PPTX 文檔。
總結(jié)
在本文中,我們討論了 PowerPoint PPTX 文件的結(jié)構(gòu)方式,以及這種結(jié)構(gòu)如何使其能夠在 PPTX 閱讀器之外輕松編輯 PowerPoint 文檔。然后,我們建議 Apache POI 庫作為 Java 開發(fā)人員的開源解決方案,用于程序化替換 PPTX 文件中的字符串,然后還探索了一個免費(fèi)的第三方 API 解決方案,用于以較低的本地內(nèi)存成本處理相同的過程。
以上就是在Java中編輯PowerPoint PPTX文檔的操作過程的詳細(xì)內(nèi)容,更多關(guān)于Java編輯PowerPoint PPTX文檔的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring配置文件解析之BeanDefinitionReader詳解
這篇文章主要介紹了Spring配置文件解析之BeanDefinitionReader詳解,ApplicationContext.xml配置文件解析成Document對象,真正對xml中元素解析的類是在BeanDefinitionDocumentReader的實現(xiàn)類中來完成的,需要的朋友可以參考下2024-02-02java8新特性之stream的collect實戰(zhàn)教程
這篇文章主要介紹了java8新特性之stream的collect實戰(zhàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟
這篇文章主要介紹了SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10解決OkHttp接收gzip壓縮數(shù)據(jù)返回亂碼問題
這篇文章主要介紹了解決OkHttp接收gzip壓縮數(shù)據(jù)返回亂碼問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06詳解多云架構(gòu)下的JAVA微服務(wù)技術(shù)解析
本文介紹了基于開源自建和適配云廠商開發(fā)框架兩種構(gòu)建多云架構(gòu)的思路,以及這些思路的優(yōu)缺點2021-05-05