本文主要分享的是关于Apache POI将PPT转换成图片的相关内容,简单介绍了Apache POI,具体内容如下。
1、Apache POI 简介
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
1
|
可以查看官方文档 <a target="_blank" href="http://poi.apache.org/" rel="external nofollow">Apache POI官网</a>
|
Apache POI操作PPT文档有两种方式:
1.POI-HSLF 对应的 Powerpoint ‘97(-2007) 的文件格式 – 后缀名为 .ppt
2.POI-XSLF 对应的PowerPoint 2007 OOXML 的文件格式 – 后缀名为 .pptx
2、JAR包
POI 操作office需要的jar包:
1
2
3
4
5
|
poi- 3.12 .jar
poi-ooxml- 3.12 .jar
poi-ooxml-schemas- 3.12 .jar
poi-scratchpad- 3.12 .jar
xmlbeans- 2.6 . 0 .jar
|
maven方式引入:
maven 方式只需要引入两个就可以,因为他们依赖了其他几个
1
2
3
4
5
6
7
8
9
10
|
< dependency >
< groupId >org.apache.poi</ groupId >
< artifactId >poi-ooxml</ artifactId >
< version >3.12</ version >
</ dependency >
< dependency >
< groupId >org.apache.poi</ groupId >
< artifactId >poi-scratchpad</ artifactId >
< version >3.12</ version >
</ dependency >
|
3、POI-HSLF 方式
POI-HSLF 方式处理PPT以 .ppt 后缀结尾的文档。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
/**
* ppt2003 文档的转换 后缀名为.ppt
* @param pptFile ppt文件
* @param imgFile 图片将要保存的目录(不是文件)
* @return
*/
public static Boolean doPPT2003toImage(File pptFile,File imgFile,List<String> list) {
try {
FileInputStream is = new FileInputStream(pptFile);
SlideShow ppt = new SlideShow(is);
//及时关闭掉 输入流
is.close();
Dimension pgsize = ppt.getPageSize();
Slide[] slide = ppt.getSlides();
for ( int i = 0 ; i < slide.length; i++) {
log.info( "第" + i + "页。" );
TextRun[] truns = slide[i].getTextRuns();
for ( int k = 0 ; k < truns.length; k++) {
RichTextRun[] rtruns = truns[k].getRichTextRuns();
for ( int l = 0 ; l < rtruns.length; l++) {
// 原有的字体索引 和 字体名字
int index = rtruns[l].getFontIndex();
String name = rtruns[l].getFontName();
log.info( "原有的字体索引 和 字体名字: " +index+ " - " +name);
// 重新设置 字体索引 和 字体名称 是为了防止生成的图片乱码问题
rtruns[l].setFontIndex( 1 );
rtruns[l].setFontName( "宋体" );
}
}
//根据幻灯片大小生成图片
BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setPaint(Color.white);
graphics.fill( new Rectangle2D. float ( 0 , 0 , pgsize.width,pgsize.height));
slide[i].draw(graphics);
// 图片的保存位置
String absolutePath = imgFile.getAbsolutePath()+ "/" + (i + 1 ) + ".jpeg" ;
File jpegFile = new File(absolutePath);
// 图片路径存放
list.add((i + 1 ) + ".jpeg" );
// 如果图片存在,则不再生成
if (jpegFile.exists()) {
continue ;
}
// 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
FileOutputStream out = new FileOutputStream(jpegFile);
ImageIO.write(img, "jpeg" , out);
out.close();
}
log.error( "PPT转换成图片 成功!" );
return true ;
}
catch (Exception e) {
log.error( "PPT转换成图片 发生异常!" , e);
}
return false ;
}
|
4、POI-XSLF 方式
POI-XSLF 方式处理PPT文件以 .pptx 后缀结尾的文档。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
/**
* ppt2007文档的转换 后缀为.pptx
* @param pptFile PPT文件
* @param imgFile 图片将要保存的路径目录(不是文件)
* @param list 存放文件名的 list
* @return
*/
public static Boolean doPPT2007toImage(File pptFile,File imgFile,List<String> list) {
FileInputStream is = null ;
try {
is = new FileInputStream(pptFile);
XMLSlideShow xmlSlideShow = new XMLSlideShow(is);
is.close();
// 获取大小
Dimension pgsize = xmlSlideShow.getPageSize();
// 获取幻灯片
XSLFSlide[] slides = xmlSlideShow.getSlides();
for ( int i = 0 ; i < slides.length ; i++) {
// 解决乱码问题
XSLFShape[] shapes = slides[i].getShapes();
for (XSLFShape shape : shapes) {
if (shape instanceof XSLFTextShape) {
XSLFTextShape sh = (XSLFTextShape) shape;
List<XSLFTextParagraph> textParagraphs = sh.getTextParagraphs();
for (XSLFTextParagraph xslfTextParagraph : textParagraphs) {
List<XSLFTextRun> textRuns = xslfTextParagraph.getTextRuns();
for (XSLFTextRun xslfTextRun : textRuns) {
xslfTextRun.setFontFamily( "宋体" );
}
}
}
}
//根据幻灯片大小生成图片
BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setPaint(Color.white);
graphics.fill( new Rectangle2D. float ( 0 , 0 , pgsize.width,pgsize.height));
// 最核心的代码
slides[i].draw(graphics);
//图片将要存放的路径
String absolutePath = imgFile.getAbsolutePath()+ "/" + (i + 1 ) + ".jpeg" ;
File jpegFile = new File(absolutePath);
// 图片路径存放
list.add((i + 1 ) + ".jpeg" );
//如果图片存在,则不再生成
if (jpegFile.exists()) {
continue ;
}
// 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
FileOutputStream out = new FileOutputStream(jpegFile);
// 写入到图片中去
ImageIO.write(img, "jpeg" , out);
out.close();
}
log.error( "PPT转换成图片 成功!" );
return true ;
}
catch (Exception e) {
log.error( "PPT转换成图片 发生异常!" , e);
}
return false ;
}
|
5、可能出现的错误
1
|
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007 + XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
|
出现以上错误,说明是没有对应起来使用,应该使用第二种方式来转换PPT。
有时候核心转换的时候很容易出问题,是因为POI没有做得很好,图片有时候容易失真。
1
2
|
// 最核心的代码
slides[i].draw(graphics);
|
总结
以上就是本文关于Apache POI将PPT转换成图片实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/mybook201314/article/details/68491373