POIpptx转图片
- 手机
- 2025-08-27 13:12:02

前言
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 字体我准备了一个自己的字体库,包含了大部分字体,下载地址 gitee /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侵入,但第一次预览时,它需要先下载再转换,才能预览,耗时不说,最关键有时候会转换失败,直接无法预览。时好时坏,而且文件一旦更新,还要想法让它重新下载进行转换,用户体验太差。还有一个关键,文件一般情况下都是受保护的系统资源,不会轻易让第三方下载,接口都是需要权限验证的,对外开放一个可随意下载文件的接口,即便是内网的也有一定安全隐患。 这个项目要想成功,必须做以下改进
提供后端API接口,该接口接收要预览的文件,并对文件进行转换,返回转换结果;上述接口需要用户传递appName(应用)等辅助属性,用以生成文件唯一标识;用户使用唯一标识进行文件预览;这样可以在文件上传时,就进行转换,转换失败也可以提前知道;每次调接口必然是一次新的转换,没有缓存的问题。不对外提供任何无权限的全量文件下载接口,更安全。
POIpptx转图片由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“POIpptx转图片”