POI pptx轉圖片

前言

ppt頁面預覽一直是個問題,office本身雖然有預覽功能但是收費,一些開源的項目的預覽又不太好用,例如開源的:kkfileview

pptx轉圖片

1. 引入pom依賴

我這個項目比較老,使用版本較舊

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version>
</dependency>

2. 核心方法

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;public static final int IMG_SCALE = 2;//推薦使用整數
public static final String IMG_EXT = "png";public static void pptxToPng(InputStream pptFile,String imgPath){try (XMLSlideShow ppt = new XMLSlideShow(in)) {for(XSLFSlide slide : ppt.getSlides()) {writeImg(slideToImage(slide),imgPath);}}	
}public static BufferedImage slideToImage(XSLFSlide slide) {Dimension pgsize = slide.getSlideShow().getPageSize();BufferedImage img = new BufferedImage((pgsize.width+20)*IMG_SCALE, (pgsize.height+55)*IMG_SCALE, BufferedImage.TYPE_INT_ARGB);Graphics2D graphics = img.createGraphics();graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width+20, pgsize.height+55));//+20 +55 解決一些情況下內容溢出轉圖片被截斷問題graphics.scale(IMG_SCALE, IMG_SCALE);graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);slide.draw(graphics);graphics.dispose();return img;
}
public static void writeImg(BufferedImage img,String filePath){String imgName = System.currentTimeMillis()+"."+IMG_EXT;File fileImg = new File(filePath+"/"+imgName);fileImg.mkdirs();ImageIO.write(img, IMG_EXT.toUpperCase(), fileImg);
}

通過IMG_SCALE提高圖片分辨率,不設置圖片不清晰

3. 中文亂碼及字體

以上代碼在windows環境沒有任何問題,但在Linux下會有中文亂碼,字體不對等問題,主要原因就是Linux系統里沒有ppt內對應的字體,需要安裝相應字體,ppt里用到的所有字體都需要安裝,否則轉換出來就會有字體問題;

3.1 字體

我準備了一個自己的字體庫,包含了大部分字體,下載地址
https://gitee.com/suozq/linux-font.git
缺少什么字體可以到C:\Windows\Fonts目錄下找

3.2 linux下安裝字體(以centos7為例,其他類似)

一、復制zhFonts到/usr/share/fonts目錄下;
在這里插入圖片描述
二、在zhFonts目錄下依次執行以下3個命令

mkfontscale
mkfontdir 
fc-cache -fv

三、重啟java應用重新生成圖片即可;

注意:ppt轉圖片時,當ppt中包含圖片時,有些特殊的圖片格式(例如:emf),是無法成功轉換的,轉換后,這些特殊格式的圖片會缺失,因此ppt里使用圖片需要謹慎,最好使用jpg,png這些主流格式;

另外:

kkfileview 它雖然實現了預覽,對代碼0侵入,但第一次預覽時,它需要先下載再轉換,才能預覽,耗時不說,最關鍵有時候會轉換失敗,直接無法預覽。時好時壞,而且文件一旦更新,還要想法讓它重新下載進行轉換,用戶體驗太差。還有一個關鍵,文件一般情況下都是受保護的系統資源,不會輕易讓第三方下載,接口都是需要權限驗證的,對外開放一個可隨意下載文件的接口,即便是內網的也有一定安全隱患。
這個項目要想成功,必須做以下改進

  1. 提供后端API接口,該接口接收要預覽的文件,并對文件進行轉換,返回轉換結果;
  2. 上述接口需要用戶傳遞appName(應用)等輔助屬性,用以生成文件唯一標識;
  3. 用戶使用唯一標識進行文件預覽;

這樣可以在文件上傳時,就進行轉換,轉換失敗也可以提前知道;每次調接口必然是一次新的轉換,沒有緩存的問題。不對外提供任何無權限的全量文件下載接口,更安全。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71581.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

零基礎學python--------第三節:Python的流程控制語法

Python&#xff0c;浮點數 11.345(單&#xff1a;4個字節&#xff0c; 雙&#xff1a;8個字節) 。 十進制的數字25 ---> 11001 講一個小數轉化為二進制&#xff1a; 不斷的乘以2 。取整數部分。 十進制的0.625 ----> 二進制&#xff1a; 0&#xff0c; 101 。 0.3 ---…

2025.2.21 Restless And Brave

今天是2025年的2月21日&#xff0c;星期五。 距離考研出分還有兩天半的時間。 這種時候&#xff0c;我想考的特別好的同學或者考的特別差的同學都不會太焦慮&#xff0c;只有我這種考的不上不下的人才會焦慮。 我曾不止一次的想過如何面對失敗&#xff0c;但每每想到這個問題…

骶骨神經

骶骨腫瘤手術后遺癥是什么_39健康網_癌癥 [健康之路]匠心仁術&#xff08;七&#xff09; 勇闖禁區 骶骨腫瘤切除術

DeepSeek智能測試知識庫助手PRO版:多格式支持+性能優化

前言 測試工程師在管理測試資產時,需要面對多種文檔格式、大量文件分類及知識庫的構建任務。為了解決這些問題,我們升級了 DeepSeek智能測試知識庫助手,不僅支持更多文檔格式,還加入了 多線程并發處理 和 可擴展格式支持,大幅提升處理性能和靈活性。 主要功能亮點: 多格…

Ubuntu編譯ZLMediaKit

下載 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安裝工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…

如何做接口自動化測試?

一、前言 接口通俗來講就是前端和后段之間傳輸數據的橋梁&#xff0c;注意&#xff1a;不是每一個項目都有接口&#xff0c;一些大型項目是前后端分離的&#xff0c;那么他們怎么實現數據的傳遞和返回呢&#xff1f;在通俗來講就是前端和后段都有一個模擬參數數據 二、接口自…

數據分析和數據挖掘的工作內容

基本的數據分析工作通常包含以下幾個方面的內容&#xff1a; 確定目標&#xff08;輸入&#xff09;&#xff1a;理解業務&#xff0c;確定指標口徑。獲取數據&#xff1a;數據倉庫&#xff08;SQL提數&#xff09;、電子表格、三方接口、網絡爬蟲、開放數據集等。清洗數據&am…

基于Python+Vue開發的反詐視頻宣傳管理系統源代碼

項目簡介 該項目是基于PythonVue開發的反詐視頻宣傳管理系統&#xff08;前后端分離&#xff09;&#xff0c;這是一項為大學生課程設計作業而開發的項目。該系統旨在幫助大學生學習并掌握Python編程技能&#xff0c;同時鍛煉他們的項目設計與開發能力。通過學習基于Python的反…

StarRocks FE leader節點CPU使用率周期性的忽高忽低問題分析

背景 本文基于 StarRocks 3.3.5 最近在做一些 StarRocks 相關的指標監控的時候&#xff0c;看到了FE master的CPU使用率相對其他FE節點是比較高的&#xff0c;且 呈現周期性的變化&#xff08;周期為8分鐘&#xff09;&#xff0c; 于此同時FE master節點的GC頻率相對于其他節…

第37章 合作之路與占坑成功

在春寒料峭的時節&#xff0c;那絲絲寒意宛如一縷縷若有若無的輕煙&#xff0c;在空氣中悄然彌漫。銳創所的會議室&#xff0c;宛如一個被歲月塵封的神秘空間&#xff0c;暖黃色的燈光暈染開來&#xff0c;像是為整個房間披上了一層朦朧的薄紗&#xff0c;陳舊卻又帶著幾分溫馨…

Webpack打包優化

在使用 Webpack 打包項目時&#xff0c;隨著項目規模的擴大&#xff0c;構建時間和打包產物的體積可能會逐漸增加。為了提高構建性能和減小打包產物的體積&#xff0c;可以采取以下幾種 Webpack 打包優化 的方法。 1. 使用 mode 配置 Webpack 通過 mode 配置來指定構建模式。…

計算機專業知識【深入理解IP網段:192.168.1.1/24 與 192.168.1.0/24】

在網絡世界里&#xff0c;IP地址和網段是非常基礎卻又至關重要的概念。很多朋友在看到類似 192.168.1.1/24 和 192.168.1.0/24 這樣的表述時&#xff0c;可能會感到困惑。今天&#xff0c;我們就來詳細剖析一下它們的含義以及兩者之間的關系。 一、IP地址與子網掩碼基礎 在深…

python的if判斷和循環語句(while循環和for循環)

1.if判斷 1.1if判斷的基本格式 if 判斷條件&#xff1a; 滿足條件做的事 score input("請輸入成績&#xff1a;") if score 100:print("你真棒") if score 60:print("還要加油") 使用input輸入默認類型為字符串類型 1.2運算符 1.2…

洛谷P9240 [藍橋杯 2023 省 B] 冶煉金屬

題目描述 小藍有一個神奇的爐子用于將普通金屬 O 冶煉成為一種特殊金屬 X。這個爐子有一個稱作轉換率的屬性 V&#xff0c;V 是一個正整數&#xff0c;這意味著消耗 V 個普通金屬 O 恰好可以冶煉出一個特殊金屬 X&#xff0c;當普通金屬 O 的數目不足 V 時&#xff0c;無法繼續…

Rpc導讀

手寫Rpc框架 - 導讀 git倉庫-all-rpc GTIEE&#xff1a;https://gitee.com/quercus-sp204/all-rpc 【參考源碼 yrpc】 1. Rpc概念 RPC 即遠程過程調用&#xff08;Remote Procedure Call&#xff09; &#xff0c;就是通過網絡從遠程計算機程序上請求服務。 本地調用抽象&…

網絡安全:防范NetBIOS漏洞的攻擊

稍微懂點電腦知識的朋友都知道&#xff0c;NetBIOS 是計算機局域網領域流行的一種傳輸方式&#xff0c;但你是否還知道&#xff0c;對于連接互聯網的機器來講&#xff0c;NetBIOS是一大隱患。 漏洞描述 NetBIOS(Network Basic Input Output System&#xff0c;網絡基本輸入輸…

VIE(可變利益實體)架構通俗解析 —— 以阿里巴巴為例(中英雙語)

VIE&#xff08;可變利益實體&#xff09;架構通俗解析 —— 以阿里巴巴為例 什么是 VIE 架構&#xff1f; VIE&#xff08;Variable Interest Entity&#xff0c;可變利益實體&#xff09;是一種特殊的法律結構&#xff0c;主要用于中國企業在海外上市&#xff0c;特別是受中…

使用代碼與 AnythingLLM 交互的基本方法和示例

AnythingLLM 是一個基于大語言模型&#xff08;LLM&#xff09;的工具&#xff0c;主要用于構建和管理個人或企業知識庫。雖然它主要提供圖形化界面&#xff08;GUI&#xff09;進行操作&#xff0c;但也可以通過代碼進行一些高級配置和集成。以下是使用代碼與 AnythingLLM 交互…

用DeepSeek零基礎預測《哪吒之魔童鬧海》票房——從數據爬取到模型實戰

系列文章目錄 1.元件基礎 2.電路設計 3.PCB設計 4.元件焊接 5.板子調試 6.程序設計 7.算法學習 8.編寫exe 9.檢測標準 10.項目舉例 11.職業規劃 文章目錄 **一、為什么要預測票房&#xff1f;****二、準備工作****三、實戰步驟詳解****Step 1&#xff1a;數據爬取與清洗&am…

如何將MySQL數據庫遷移至阿里云

將 MySQL 數據庫遷移至阿里云可以通過幾種不同的方法&#xff0c;具體選擇哪種方式取決于你的數據庫大小、數據復雜性以及對遷移速度的需求。阿里云提供了多種遷移工具和服務&#xff0c;本文將為你介紹幾種常見的方法。 方法一&#xff1a;使用 阿里云數據庫遷移服務 (DTS) 阿…