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