POI之PPT轉(zhuǎn)image,SmartArt解決方法
關(guān)于使用 POI 將 PPT 轉(zhuǎn)為 圖片,隨便就能查到以下代碼枪眉。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
public class PpttoPNG {
public static void main(String args[]) throws IOException {
//creating an empty presentation
File file = new File("addingimage.pptx");
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file));
//getting the dimensions and size of the slide
Dimension pgsize = ppt.getPageSize();
XSLFSlide[] slide = ppt.getSlides();
for (int i = 0; i < slide.length; i++) {
BufferedImage img = new BufferedImage(
pgsize.width, pgsize.height,BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
//clear the drawing area
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
//render
slide[i].draw(graphics);
}
//creating an image file as output
FileOutputStream out = new FileOutputStream("ppt_image.png");
javax.imageio.ImageIO.write(img, "png", out);
ppt.write(out);
System.out.println("Image successfully created");
out.close();
}
}
但是問題顯然不會這么簡單掸茅,經(jīng)過實驗發(fā)現(xiàn)。
通過POI導出的圖片匆光,出現(xiàn)以下幾個問題:
- 無法讀取 SmartArt
- 藝術(shù)字只能顯示為普通文本
- 圖形陰影無法顯示
- 部分自定義幾何圖形顯示異常
然后就出現(xiàn)了這種狀況:
PPT文件的內(nèi)容:
PPT文件的內(nèi)容
導出的內(nèi)容(這是什么鬼):
image.png
然后上網(wǎng)查解決方法:
stack overflow
無解又是什么鬼
解決方法
無解,所以我們拋棄了 POI酿联,改用其他方式導出终息。
1.改用java調(diào)用Python
如果你不會python,可以將下面的py代碼放到項目下贞让,通過 jython
解釋器來執(zhí)行周崭。
import comtypes.client as client
import os
def init_powerpoint():
powerpoint = client.CreateObject("Powerpoint.Application")
powerpoint.Visible = 1
return powerpoint
def ppt_to_pdf(powerpoint, inputFileName, outputFileName, formatType=32):
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName[0:-4] + "pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.SaveAs(outputFileName, formatType) # formatType = 32 for ppt to pdf
deck.SaveAs(inputFileName.rsplit('.')[0] + '.jpg', 17)
deck.Close()
def convert_files_in_folder(powerpoint, folder):
files = os.listdir(folder)
pptfiles = [f for f in files if f.endswith((".ppt", ".pptx"))]
for pptfile in pptfiles:
fullpath = os.path.join(cwd, pptfile)
ppt_to_pdf(powerpoint, fullpath, fullpath)
if __name__ == "__main__":
powerpoint = init_powerpoint()
cwd = os.getcwd()
convert_files_in_folder(powerpoint, cwd)
powerpoint.Quit()
這種方法應該是最適合的了,導出的圖片接近完美喳张。
2.使用第三方服務
阿里云提供了一個“智能媒體管理”的服務续镇,其中包含了許多的文檔轉(zhuǎn)換的API。省事
收費標準
轉(zhuǎn)換服務