pptPreview.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.ruoyi.project.officeConvert;
  2. import com.ruoyi.common.constant.Constants;
  3. import org.apache.poi.sl.draw.Drawable;
  4. import org.apache.poi.sl.usermodel.TextRun;
  5. import org.apache.poi.xslf.usermodel.*;
  6. import org.apache.poi.hslf.usermodel.*;
  7. import javax.imageio.ImageIO;
  8. import java.awt.*;
  9. import java.awt.geom.Rectangle2D;
  10. import java.awt.image.BufferedImage;
  11. import java.io.File;
  12. import java.io.FileInputStream;
  13. import java.io.FileOutputStream;
  14. import java.lang.ref.WeakReference;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. public class pptPreview {
  18. //pptx转为图片的方法
  19. public static List pptToImage(File pptFile, File imgFile,String newName) {
  20. //pptx转为图片 利用轮播图 返回 图片的路径地址
  21. List<String> list = new ArrayList<>();
  22. FileInputStream is = null ;
  23. int imgCount = 0;
  24. try {
  25. is = new FileInputStream(pptFile);
  26. XMLSlideShow xmlSlideShow = new XMLSlideShow(is);
  27. is.close();
  28. // 获取大小
  29. Dimension pgsize = xmlSlideShow.getPageSize();
  30. // 获取幻灯片
  31. List<XSLFSlide> slides = xmlSlideShow.getSlides();
  32. imgCount = slides.size();
  33. for (int i = 0 ; i < slides.size() ; i++) {
  34. // 解决乱码问题
  35. List<XSLFShape> shapes = slides.get(i).getShapes();
  36. for (XSLFShape shape : shapes) {
  37. if (shape instanceof XSLFTextShape) {
  38. XSLFTextShape sh = (XSLFTextShape) shape;
  39. List<XSLFTextParagraph> textParagraphs = sh.getTextParagraphs();
  40. for (XSLFTextParagraph xslfTextParagraph : textParagraphs) {
  41. List<XSLFTextRun> textRuns = xslfTextParagraph.getTextRuns();
  42. for (XSLFTextRun xslfTextRun : textRuns) {
  43. xslfTextRun.setFontFamily("宋体");
  44. }
  45. }
  46. }
  47. }
  48. //根据幻灯片大小生成图片
  49. BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
  50. Graphics2D graphics = img.createGraphics();
  51. graphics.setPaint(Color.white);
  52. graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
  53. graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  54. graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
  55. graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
  56. graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
  57. graphics.setRenderingHint(Drawable.BUFFERED_IMAGE, new WeakReference<>(img));
  58. //每个文件路径对应自己文件名的文件夹,以区别防止文件名也重复
  59. // 最核心的代码
  60. slides.get(i).draw(graphics);
  61. //图片将要存放的路径
  62. String absolutePath = imgFile.getAbsolutePath()+"/"+ newName+(i + 1) + ".jpeg";
  63. File jpegFile = new File(absolutePath);
  64. // 图片路径存放
  65. list.add(Constants.RESOURCE_PREFIX+ "/"+newName+(i + 1) + ".jpeg");
  66. /*//如果图片存在,则不再生成
  67. if (jpegFile.exists()) {
  68. continue;
  69. }*/
  70. // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
  71. FileOutputStream out = new FileOutputStream(jpegFile);
  72. // 写入到图片中去
  73. ImageIO.write(img, "jpeg", out);
  74. out.close();
  75. }
  76. System.out.print("PPT转换成图片 成功!");
  77. //log.error("PPT转换成图片 成功!");
  78. return list;
  79. }
  80. catch (Exception e) {
  81. e.printStackTrace();
  82. System.out.print("PPT转换成图片 发生异常!");
  83. // log.error("PPT转换成图片 发生异常!", e);
  84. }
  85. return list;
  86. }
  87. //ppt和pptx仅用的操作类不一样,其他逻辑一致
  88. public static List pptxToImage(File pptFile, File imgFile,String newName) {
  89. //ppt转为图片 利用轮播图 返回 图片的路径地址
  90. List<String> list = new ArrayList<>();
  91. FileInputStream is = null ;
  92. int imgCount = 0;
  93. try {
  94. is = new FileInputStream(pptFile);
  95. //使用hslf即可
  96. HSLFSlideShow ppt = new HSLFSlideShow(is);
  97. //及时关闭掉 输入流
  98. is.close();
  99. Dimension pgsize = ppt.getPageSize();
  100. List<HSLFSlide> slide = ppt.getSlides();
  101. for (int i = 0; i < slide.size(); i++) {
  102. List<HSLFShape> shapes = slide.get(i).getShapes();
  103. for (HSLFShape shape : shapes) {
  104. if (shape instanceof HSLFTextShape) {
  105. HSLFTextShape sh = (HSLFTextShape) shape;
  106. List<HSLFTextParagraph> textParagraphs = sh.getTextParagraphs();
  107. for (HSLFTextParagraph xslfTextParagraph : textParagraphs) {
  108. List<HSLFTextRun> textRuns = xslfTextParagraph.getTextRuns();
  109. for (HSLFTextRun xslfTextRun : textRuns) {
  110. xslfTextRun.setFontFamily("宋体");
  111. }
  112. }
  113. }
  114. }
  115. //根据幻灯片大小生成图片
  116. BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
  117. Graphics2D graphics = img.createGraphics();
  118. graphics.setPaint(Color.white);
  119. graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
  120. graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  121. graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
  122. graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
  123. graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
  124. graphics.setRenderingHint(Drawable.BUFFERED_IMAGE, new WeakReference<>(img));
  125. //每个文件路径对应自己文件名的文件夹,以区别防止文件名也重复
  126. // 最核心的代码
  127. slide.get(i).draw(graphics);
  128. //图片将要存放的路径
  129. String absolutePath = imgFile.getAbsolutePath()+"/"+ newName+(i + 1) + ".jpeg";
  130. File jpegFile = new File(absolutePath);
  131. // 图片路径存放
  132. list.add(Constants.RESOURCE_PREFIX+ "/"+newName+(i + 1) + ".jpeg");
  133. /*//如果图片存在,则不再生成
  134. if (jpegFile.exists()) {
  135. continue;
  136. }*/
  137. // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
  138. FileOutputStream out = new FileOutputStream(jpegFile);
  139. // 写入到图片中去
  140. ImageIO.write(img, "jpeg", out);
  141. out.close();
  142. }
  143. System.out.print("PPT转换成图片 成功!");
  144. //log.error("PPT转换成图片 成功!");
  145. return list;
  146. }
  147. catch (Exception e) {
  148. e.printStackTrace();
  149. System.out.print("PPT转换成图片 发生异常!");
  150. // log.error("PPT转换成图片 发生异常!", e);
  151. }
  152. return list;
  153. }
  154. }