使用Apache POI怎么将PPT转换成图片

发布时间:2021-02-20 16:52:25 作者:Leah
来源:亿速云 阅读:365

使用Apache POI怎么将PPT转换成图片?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1、Apache POI 简介

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。

可以查看官方文档 Apache POI官网

Apache POI操作PPT文档有两种方式:

1.POI-HSLF 对应的 Powerpoint ‘97(-2007) 的文件格式 – 后缀名为 .ppt
2.POI-XSLF 对应的PowerPoint 2007 OOXML 的文件格式 – 后缀名为 .pptx

2、JAR包

POI 操作office需要的jar包:

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 方式只需要引入两个就可以,因为他们依赖了其他几个

<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 后缀结尾的文档。

/**
   * 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 后缀结尾的文档。

/**
   * 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、可能出现的错误

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没有做得很好,图片有时候容易失真。

// 最核心的代码
slides[i].draw(graphics);

看完上述内容,你们掌握使用Apache POI怎么将PPT转换成图片的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. 制作PPT必备的1款神级插件,它的使用率高达90%以上,不服来辩!
  2. 利用java反射机制导出Excel的公共方法以及使用的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

apache poi ppt

上一篇:Java怎么与Unix时间戳进行转换

下一篇:怎么将Java时间转换成unix时间戳

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》