文件预览 java实现_JAVA实现文件预览(三)

JAVA+POI实现PPT的在线预览

接前几篇文章,实现PPT的在线预览,过程如下:

1)将PPT转为一个图片集合保存在一个文件夹中

2)将图片集合转化为PDF,从而实现PPT的预览

在实现这一功能的过程中,参阅了很多博客和资料,才算是完整的实现这一功能,但是 PPT转化为图片的时候依然会有些许问题,比如:PPT中 的表格会缺失,这一问题还未得到解决,之后若是实现的话,会继续补充的。

看了好多文章,好像就是只能 两步转实现这个功能,未查到PPT直接预览或者PPT直接转为PDF格式的,如果大家有更好的解决方法的话,如若愿意分享的,还请留言。万分感谢!!!

此文章只是为了记录自己学习的过程,经测有效~~~

PPT转为图片集合实现类:

package cn.itcast.QLN.utils;

import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.Rectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.UUID;

import javax.imageio.ImageIO;

import org.apache.poi.POIXMLDocument;import org.apache.poi.hslf.extractor.PowerPointExtractor;import org.apache.poi.hslf.usermodel.HSLFSlide;import org.apache.poi.hslf.usermodel.HSLFSlideShow;import org.apache.poi.hslf.usermodel.HSLFTextParagraph;import org.apache.poi.hslf.usermodel.HSLFTextRun;import org.apache.poi.openxml4j.exceptions.OpenXML4JException;import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;import org.apache.poi.xslf.usermodel.XMLSlideShow;import org.apache.poi.xslf.usermodel.XSLFSlide;import org.apache.xmlbeans.XmlException;import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont;import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;

/**  * PPT转image工具类  * 使用的Apache poi-3.14的版本  依赖第三方jar包:poi-3.14-20160307.jar、poi-ooxml-3.14-20160307.jar、  *                                      poi-ooxml-schemas-3.14-20160307.jar、poi-scratchpad-3.14-20160307.jar、xmlbeans-2.6.0.jar  * @author yds   * @date 2017-03-22  *  */  public class ppt2img { /**      * 将PPTX 文件转换成image      * @param orignalPPTFileName  //PPTX文件路径 如:d:/demo/demo1.pptx      * @param targetImageFileDir //转换后的图片保存路径 如:d:/demo/pptxImg      * @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"      * @return Map      *  key: converReturnResult   类型:boolean 转化结果 true 代表转换成功,false 代表转换失败      *  key:imgNames              类型:List 转换成功后图片的全部名称集合      *  注:获取“imgNames”图片名称集合时,请先判断“converReturnResult” 是否为true;如果有一张转换失败则为false      */      @SuppressWarnings("resource")      public static  Map converPPTXtoImage(String orignalPPTFileName,String targetImageFileDir,              String imageFormatNameString){          Map map=new HashMap();          boolean converReturnResult=true;//是否全部转成功          List imgNamesList=new ArrayList();//PPT转成图片后所有名称集合                              FileInputStream orignalPPTFileInputStream=null;          FileOutputStream orignalPPTFileOutStream=null;          XMLSlideShow oneSlideShow=null;                    try{              try {                  orignalPPTFileInputStream=new FileInputStream(orignalPPTFileName);              } catch (FileNotFoundException e) {                  e.printStackTrace();                  converReturnResult=false;                  map.put("converReturnResult", converReturnResult);                  return map;              }                            try {                  oneSlideShow=new XMLSlideShow(orignalPPTFileInputStream);              } catch (IOException e) {                  e.printStackTrace();                  converReturnResult=false;                  map.put("converReturnResult", converReturnResult);                  return map;              }              //获取PPT每页的尺寸大小(宽和高度)              Dimension onePPTPageSize=oneSlideShow.getPageSize();              //获取PPT文件中的所有PPT页面,并转换为一张张播放片              List pptPageXSLFSLiseList= oneSlideShow.getSlides();                            String xmlFontFormat=""+                                       " "+                                      " "+                                  ""+                                "";                                            for (int i = 0; i < pptPageXSLFSLiseList.size(); i++) {                  /**                  * 设置中文为宋体,解决中文乱码问题                  */                  CTSlide oneCTSlide=pptPageXSLFSLiseList.get(i).getXmlObject();                  CTGroupShape oneCTGroupShape=oneCTSlide.getCSld().getSpTree();                   List  oneCTShapeList=oneCTGroupShape.getSpList();                   for (CTShape ctShape : oneCTShapeList) {                       CTTextBody oneCTTextBody = ctShape.getTxBody();                                              if(null==oneCTTextBody){                           continue;                       }                       CTTextParagraph[]  oneCTTextParagraph= oneCTTextBody.getPArray();                       CTTextFont oneCTTextFont=null;                       try {                          oneCTTextFont=CTTextFont.Factory.parse(xmlFontFormat);                      } catch (XmlException e) {                          e.printStackTrace();                      }                                              for (CTTextParagraph ctTextParagraph : oneCTTextParagraph) {                           CTRegularTextRun[]  onrCTRegularTextRunArray=ctTextParagraph.getRArray();                           for (CTRegularTextRun ctRegularTextRun : onrCTRegularTextRunArray) {                               CTTextCharacterProperties  oneCTTextCharacterProperties =ctRegularTextRun.getRPr();                               oneCTTextCharacterProperties.setLatin(oneCTTextFont);                                                         }                                                 }                  }                                      //创建BufferedImage 对象,图像尺寸为原来的PPT的每页尺寸                                      BufferedImage oneBufferedImage=new BufferedImage(onePPTPageSize.width, onePPTPageSize.height, BufferedImage.TYPE_INT_RGB);                   Graphics2D  oneGraphics2D = oneBufferedImage.createGraphics();                   //将PPT文件中的每个页面中的相关内容画到转换后的图片中                   pptPageXSLFSLiseList.get(i).draw(oneGraphics2D);                   /**                   * 设置图片的存放路径和图片格式,注意生成的文件路径为绝对路径,最终获得各个图像文件所对应的输出流的对象                   */                                      try {                       String imgName=(i+1)+"_"+UUID.randomUUID().toString()+"."+imageFormatNameString;                       imgNamesList.add(imgName);//将图片名称添加的集合中                                              orignalPPTFileOutStream=new FileOutputStream(targetImageFileDir+imgName);                  } catch (FileNotFoundException e) {                      e.printStackTrace();                      converReturnResult=false;                      map.put("converReturnResult", converReturnResult);                      return map;                  }                                      //将转换后的各个图片文件保存带指定的目录中                   try {                      ImageIO.write(oneBufferedImage, imageFormatNameString, orignalPPTFileOutStream);                  } catch (IOException e) {                      e.printStackTrace();                      converReturnResult=false;                      map.put("converReturnResult", converReturnResult);                      return map;                  }                                                   }                                      } finally{              try {                  if(orignalPPTFileInputStream!=null){                      orignalPPTFileInputStream.close();                  }              } catch (IOException e) {                  e.printStackTrace();              }                            try {                  if(orignalPPTFileOutStream!=null){                      orignalPPTFileOutStream.close();                  }              } catch (IOException e) {                  e.printStackTrace();              }              map.put("converReturnResult", converReturnResult);              map.put("imgNames", imgNamesList);          }                                        return map;      }                  /**      * 将PPT 文件转换成image      * @param orignalPPTFileName  //PPT文件路径 如:d:/demo/demo1.ppt      * @param targetImageFileDir //转换后的图片保存路径 如:d:/demo/pptImg      * @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"      * @return Map      *  key: converReturnResult   类型:boolean 转化结果 true 代表转换成功,false 代表转换失败      *  key:imgNames              类型:List 转换成功后图片的全部名称集合      *  注:获取“imgNames”图片名称集合时,请先判断“converReturnResult” 是否为true;如果有一张转换失败则为false      */      @SuppressWarnings("resource")      public static Map converPPTtoImage(String orignalPPTFileName,String targetImageFileDir,              String imageFormatNameString){          Map map=new HashMap();          boolean converReturnResult=true;//是否全部转成功          List imgNamesList=new ArrayList();//PPT转成图片后所有名称集合                              FileInputStream orignalPPTFileInputStream=null;          FileOutputStream orignalPPTFileOutStream=null;          HSLFSlideShow  oneHSLFSlideShow=null;                              try{              try {                  orignalPPTFileInputStream=new FileInputStream(orignalPPTFileName);              } catch (FileNotFoundException e) {                  e.printStackTrace();                  converReturnResult=false;                  map.put("converReturnResult", converReturnResult);                  return map;              }                            try {                  oneHSLFSlideShow=new HSLFSlideShow(orignalPPTFileInputStream);              } catch (IOException e) {                  e.printStackTrace();                  converReturnResult=false;                  map.put("converReturnResult", converReturnResult);                  return map;              }              //获取PPT每页的大小(宽和高度)              Dimension  onePPTPageSize= oneHSLFSlideShow.getPageSize();                            //获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转为一张张的播放片              List pptPageSlideList=oneHSLFSlideShow.getSlides();              //下面循环的主要功能是实现对PPT文件中的每一张幻灯片进行转换和操作              for (int i = 0; i >  oneTextParagraphs=pptPageSlideList.get(i).getTextParagraphs();                  for (List list :oneTextParagraphs) {                      for (HSLFTextParagraph hslfTextParagraph : list) {                           List HSLFTextRunList= hslfTextParagraph.getTextRuns();                           for (int j = 0; j =26040)){                                  HSLFTextRunList.get(j).setFontSize(7.0);                              }                               //设置字体样式为宋体  //                          String family=HSLFTextRunList.get(j).getFontFamily();                              HSLFTextRunList.get(j).setFontFamily("宋体");                                                        }                      }                                        }                  /**                  * 创建BufferedImage对象,图像的尺寸为原来的每页的尺寸                  */                  BufferedImage oneBufferedImage=new BufferedImage(onePPTPageSize.width, onePPTPageSize.height, BufferedImage.TYPE_INT_RGB);                   Graphics2D oneGraphics2D=oneBufferedImage.createGraphics();                   /**                   * 设置转换后的图片背景色为白色                   *                    */                   oneGraphics2D.setPaint(Color.white);                   oneGraphics2D.fill(new Rectangle2D.Float(0,0,onePPTPageSize.width,onePPTPageSize.height));                   pptPageSlideList.get(i).draw(oneGraphics2D);                   /**                   * 设置图片的存放路径和图片格式,注意生成的图片路径为绝对路径,最终获得各个图像文件所对应的输出流对象                   */                   try {                                              String imgName=(i+1)+"_"+UUID.randomUUID().toString()+"."+imageFormatNameString;                       imgNamesList.add(imgName);//将图片名称添加的集合中                                             orignalPPTFileOutStream=new FileOutputStream(targetImageFileDir+imgName);                                        } catch (FileNotFoundException e) {                      e.printStackTrace();                      converReturnResult=false;                      map.put("converReturnResult", converReturnResult);                      return map;                  }                  /**                  * 转换后的图片文件保存的指定的目录中                  */                                      try {                      ImageIO.write(oneBufferedImage, imageFormatNameString, orignalPPTFileOutStream);  //                  throw new IOException();                  } catch (IOException e) {                      e.printStackTrace();                      converReturnResult=false;                      map.put("converReturnResult", converReturnResult);                      return map;                  }                                                  }                       }finally{              try {                  if(orignalPPTFileInputStream!=null){                      orignalPPTFileInputStream.close();                  }              } catch (IOException e) {                  e.printStackTrace();              }                            try {                  if(orignalPPTFileOutStream!=null){                      orignalPPTFileOutStream.close();                  }              } catch (IOException e) {                  e.printStackTrace();              }              map.put("converReturnResult", converReturnResult);              map.put("imgNames", imgNamesList);          }                                    return map;      }                   /**       * 直接抽取幻灯片的全部内容       * @param filePath       * @return       * @throws IOException       */     /* @SuppressWarnings("resource")      public static String readppt2003Text(String filePath) {                     PowerPointExtractor extractor=null;;          try {              File file = new File(filePath);               FileInputStream fin=new FileInputStream(file);              extractor = new PowerPointExtractor(fin);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                              return extractor.getText();      }              */ // 读取pptx      @SuppressWarnings("resource")      public  static String readPPTX2007Text(String file) {           try {              return new XSLFPowerPointExtractor(POIXMLDocument.openPackage(file)).getText();          } catch (XmlException e) {              e.printStackTrace();          } catch (OpenXML4JException e) {              e.printStackTrace();          } catch (IOException e) {              e.printStackTrace();          }          return null;         }

}

图片集合转PDF格式实现类

package cn.itcast.QLN.utils;

import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;

import javax.imageio.ImageIO;

import com.lowagie.text.BadElementException;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Image;import com.lowagie.text.Rectangle;import com.lowagie.text.pdf.PdfWriter;

/** * 将多张图片合并转为PDF;需要用到iTextpdf包, * *  */

public class imgs2pdf { /**     *      * @param imageFolderPath     *            图片文件夹地址     * @param pdfPath     *            PDF文件保存地址     *      */    public static void toPdf(String imageFolderPath, String pdfPath) {        try {            // 图片文件夹地址            // String imageFolderPath = "D:/Demo/ceshi/";            // 图片地址            String imagePath = null;            // PDF文件保存地址            // String pdfPath = "D:/Demo/ceshi/hebing.pdf";            // 输入流            FileOutputStream fos = new FileOutputStream(pdfPath);            // 创建文档            Document doc = new Document(null, 0, 0, 0, 0);            //doc.open();            // 写入PDF文档            PdfWriter.getInstance(doc, fos);            // 读取图片流            BufferedImage img = null;            // 实例化图片            Image image = null;            // 获取图片文件夹对象            File file = new File(imageFolderPath);            File[] files = file.listFiles();            // 循环获取图片文件夹内的图片            for (File file1 : files) {                if (file1.getName().endsWith(".png")                        || file1.getName().endsWith(".jpg")                        || file1.getName().endsWith(".gif")                        || file1.getName().endsWith(".jpeg")                        || file1.getName().endsWith(".gif")) {                    // System.out.println(file1.getName());                    imagePath = imageFolderPath + file1.getName();                    //System.out.println(file1.getName());                    // 读取图片流                    img = ImageIO.read(new File(imagePath));                    // 根据图片大小设置文档大小                    doc.setPageSize(new Rectangle(img.getWidth(), img                            .getHeight()));                    // 实例化图片                    image = Image.getInstance(imagePath);                    // 添加图片到文档                    doc.open();                    doc.add(image);                }            }            // 关闭文档            doc.close();        } catch (IOException e) {            e.printStackTrace();        } catch (BadElementException e) {            e.printStackTrace();        } catch (DocumentException e) {            e.printStackTrace();        }    }

}

action方法调用

if (suffix1.equals("pptx")) { String path2 =path.substring(0, 91); System.out.println("path2为" + path2); //创建一个新的文件夹,并命名,每次PPT转化为图片集合的时候, //便新创建一个文件夹,避免所有的图片都在一个图片集合中 String filefName=UUID.randomUUID().toString().replace("-", "1"); File dir = new File(path2+"\\"+filefName);   dir.mkdirs();  String path3=path2+filefName+"\\"; //System.out.println("path3为" + path3); //PPT转化为图片集合 Map map=ppt2img.converPPTXtoImage(path,path3,"jpg");//.readPPTX2007Text(path);//("E:\\ppt\\PMS2.0界面设计培训-20130507.pptx");               boolean converReturnResult=(Boolean) map.get("converReturnResult");          System.out.println("converReturnResult为"+converReturnResult);          if(converReturnResult){//如果全部转换成功,则为true;如果有一张转换失败,则为fasle              @SuppressWarnings("unchecked")              //List imgNames中 存储的只有图片的名字             List imgNames=(List) map.get("imgNames");          /*             for (String imgName : imgNames) {                              System.out.println("imgName为"+imgName);                  String path4 =path3+imgName;                 System.out.println("path4"+path4);                            } */                          //图片集合转化为pdf格式             imgs2pdf.toPdf(path3, path2+"new.pdf");             File files = new File(path2+"new.pdf"); long fileSizes = files.length(); String fileNames = files.getName(); String suffix = fileNames.substring(fileNames.lastIndexOf(".") + 1); // 用输入流读取文件 inputStream = new FileInputStream(files); HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType(UtilTools.returnContentType(suffix)); response.setHeader("Content-Disposition", "filename=\"" + uploadFileName + ".pdf" + "\""); byte[] buffer = new byte[(int) fileSizes]; int offset = 0; int numRead = 0; while (offset < buffer.length && (numRead = inputStream.read(buffer, offset, buffer.length - offset)) >= 0) { offset += numRead; } // 确保所有数据均被读取 if (offset != buffer.length) { throw new IOException("Could not completely read file " + files.getName()); } response.getOutputStream().write(buffer); response.getOutputStream().flush(); response.flushBuffer(); response.getOutputStream().close();         }          }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值