以下是一个Java实现简单浏览器预览服务端文档的例子,文档包括pdf,excel,word,ppt,思路是将excel,word转化为html;将ppt转为图片,再转为html;将pdf以pdf流的形式返回给浏览器,一般的浏览器都支持预览pdf。

maven依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version>
</dependency>
<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>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.15</version>
</dependency>
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.core</artifactId><version>1.0.4</version>
</dependency>
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId><version>1.0.4</version>
</dependency>
<dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.5.0</version>
</dependency>

预览pdf

byte[] datas = readFile(f);
response.setContentType("application/pdf");
response.setContentLength(datas.length);
OutputStream os = res.getOutputStream();
os.write(datas, 0, datas.length);
os.flush();
os.close();

预览页面

将转为html或者图片的文档,嵌入此html中返回给浏览器展示。

private static final StringBuilder ORIGIN_HTML = new StringBuilder("<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +"    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n" +"    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n" +"    <title>预览</title>\n" +"    <link rel=\"stylesheet\" href=\"/resource/css/simple.slide.css\">\n" +"    <link rel=\"stylesheet\" href=\"/resource/css/preview.css\">\n" +"    <script type=\"text/javascript\" src=\"../../resource/jquery-1.9.0.min.js\"></script>\n" +"    <script type=\"text/javascript\" src=\"/resource/simple.slide.js\"></script>\n" +"    <script type=\"text/javascript\">\n" +"        $(function(){\n" +"           $(\".pptimage\").simpleSlide();\n" +"        });\n" +"    </script>\n" +"</head>\n" +"<body>\n" +"       ####\n" +"</body>\n" +"</html>");

word07转为html

public static void doc07ToHtml(String from, OutputStream out, String imagePath){try{Map<String, String> map = new HashMap<String, String>();//1.如果图片文件夹存在,删除重新创建之File imagePathFile = new File(imagePath);if(imagePathFile.exists()) {FileUtils.deleteDirectory(imagePathFile);}imagePathFile.mkdirs();FileInputStream fis = new FileInputStream(from);XWPFDocument doc = new XWPFDocument(fis);XHTMLOptions options = XHTMLOptions.create();options.setExtractor(new IImageExtractor() {@Overridepublic void extract(String imagePath1, byte[] imageData) throws IOException {//2.处理文件后缀String suf = "";if(imagePath1.lastIndexOf(".") > 0) {suf = imagePath1.substring(imagePath1.lastIndexOf("."), imagePath1.length());}//3.写文件,并将文件对应关系存入mapString tempFile = imagePath+File.separator+UuidUtil.getUUID()+suf;File f = new File(tempFile);FileUtils.writeByteArrayToFile(f, imageData);map.put(imagePath1, tempFile);}});options.setIgnoreStylesIfUnused(false);options.setFragment(true);options.URIResolver(new IURIResolver() {@Overridepublic String resolve(String arg0) {if(map.containsKey(arg0)) {String u = map.get(arg0);if(!XaUtil.isEmpty(u)){try {u = URLEncoder.encode(u,"ISO-8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return "/sys/filemanage/getViewImage.do?id="+u;}return arg0;}});ByteArrayOutputStream os = new ByteArrayOutputStream();XHTMLConverter.getInstance().convert(doc, os, options);byte[] datas = os.toByteArray();os.close();//处理表格没有边框String content = new String(datas,"utf-8");content = ORIGIN_HTML.toString().replaceAll("####",content);datas = content.getBytes("utf-8");out.write(datas, 0, datas.length);out.flush();out.close();}catch(Exception e){log.error("",e);}
}

word03转为html

public static void doc03ToHtml(String from, OutputStream out, String imagePath)throws Exception{try{//1.如果图片文件夹存在,删除重新创建之File imagePathFile = new File(imagePath);if(imagePathFile.exists()) {FileUtils.deleteDirectory(imagePathFile);}imagePathFile.mkdirs();FileInputStream fis = new FileInputStream(from);HWPFDocument doc = new HWPFDocument(fis);WordToHtmlConverter converter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());converter.setPicturesManager(new PicturesManager() {@Overridepublic String savePicture(byte[] arg0, PictureType arg1, String arg2, float arg3, float arg4) {//2.处理文件后缀String suf = "";if(arg2.lastIndexOf(".") > 0) {suf = arg2.substring(arg2.lastIndexOf("."), arg2.length());}//3.写文件,并将文件对应关系存入mapString tempFile = imagePath+File.separator+UuidUtil.getUUID()+suf;File f = new File(tempFile);try {FileUtils.writeByteArrayToFile(f, arg0);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(!XaUtil.isEmpty(tempFile)){try {tempFile = URLEncoder.encode(tempFile,"ISO-8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return "/sys/filemanage/getViewImage.do?id="+tempFile;}});converter.processDocument(doc);Document htmlDocument = converter.getDocument();ByteArrayOutputStream outStream = new ByteArrayOutputStream();DOMSource domSource = new DOMSource(htmlDocument);StreamResult streamResult = new StreamResult(outStream);TransformerFactory tf = TransformerFactory.newInstance();Transformer serializer = tf.newTransformer();serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");serializer.setOutputProperty(OutputKeys.INDENT, "yes");serializer.setOutputProperty(OutputKeys.METHOD, "html");serializer.transform(domSource, streamResult);outStream.close();byte[] datas = outStream.toByteArray();//处理表格没有边框String content = new String(datas,"utf-8");content = ORIGIN_HTML.toString().replaceAll("####",content);datas = content.getBytes("utf-8");out.write(datas, 0, datas.length);out.flush();out.close();}catch(Exception e){log.error("",e);}
}

Excel转为html

public static void exceToHtml(String from, OutputStream out){InputStream in = null;XSSFWorkbook xwb = null;HSSFWorkbook hwb= null;try{in = new FileInputStream(from);Workbook wb = WorkbookFactory.create(in);if(wb instanceof XSSFWorkbook) {xwb = (XSSFWorkbook) wb;hwb = new HSSFWorkbook();ConvertXSSF2HSSF c = new ConvertXSSF2HSSF();c.transformXSSF(xwb, hwb);}else{hwb = (HSSFWorkbook) wb;}ExcelToHtmlConverter converter = new ExcelToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());converter.processWorkbook(hwb);wb.close();Document htmlDocument = converter.getDocument();ByteArrayOutputStream outStream = new ByteArrayOutputStream();DOMSource domSource = new DOMSource (htmlDocument);StreamResult streamResult = new StreamResult (outStream);TransformerFactory tf = TransformerFactory.newInstance();Transformer serializer = tf.newTransformer();serializer.setOutputProperty (OutputKeys.ENCODING, "utf-8");serializer.setOutputProperty (OutputKeys.INDENT, "yes");serializer.setOutputProperty (OutputKeys.METHOD, "html");serializer.transform (domSource, streamResult);outStream.close();String content = new String (outStream.toByteArray(),"utf-8" );content = ORIGIN_HTML.toString().replaceAll("####",content);byte[] datas = content.getBytes("utf-8");out.write(datas,0,datas.length);out.flush();out.close();}catch (Exception e){log.error("",e);}finally {try {if(null != in){in.close();}if(null != xwb){xwb.close();}if(null != hwb){hwb.close();}} catch (IOException e) {log.error("",e);}}
}

ppt07转为图片

public static String ppt07ToImage(String from, String images) {StringBuilder sb = new StringBuilder();FileInputStream fis = null;XMLSlideShow ppt = null;FileOutputStream fos = null;try {// 1.如果图片文件夹存在,删除重新创建之File imagePathFile = new File(images);if (imagePathFile.exists()) {FileUtils.deleteDirectory(imagePathFile);}imagePathFile.mkdirs();fis = new FileInputStream(from);ppt = new XMLSlideShow(fis);Dimension pageSize = ppt.getPageSize();List<XSLFSlide> slides = ppt.getSlides();String xmlFontFormat = "<xml-fragment xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">"+ "<a:rPr lang=\"zh-CN\" altLang=\"en-US\" dirty=\"0\" smtClean=\"0\"> "+ "<a:latin typeface=\"+mj-ea\"/> " + "</a:rPr>" + "</xml-fragment>";int index = 0;for (XSLFSlide slide : slides) {CTSlide cts = slide.getXmlObject();CTGroupShape groupShape = cts.getCSld().getSpTree();List<CTShape> shapeList = groupShape.getSpList();for (CTShape ctShape : shapeList) {CTTextBody oneCTTextBody = ctShape.getTxBody();if (null == oneCTTextBody) {continue;}CTTextParagraph[] oneCTTextParagraph = oneCTTextBody.getPArray();CTTextFont oneCTTextFont = null;oneCTTextFont = CTTextFont.Factory.parse(xmlFontFormat);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(pageSize.width, pageSize.height,BufferedImage.TYPE_INT_RGB);Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();// 将PPT文件中的每个页面中的相关内容画到转换后的图片中slides.get(index).draw(oneGraphics2D);/*** 设置图片的存放路径和图片格式,注意生成的文件路径为绝对路径,最终获得各个图像文件所对应的输出流的对象*/String imgName = images + File.separator + UuidUtil.getUUID() + ".jpg";sb.append(imgName + ",");fos = new FileOutputStream(imgName);ImageIO.write(oneBufferedImage, "jpg", fos);index++;}} catch (Exception e) {e.printStackTrace();}finally {try {if(null != fis) {fis.close();}if(null != ppt) {ppt.close();}if(null != fos){fos.close();}} catch (IOException e) {e.printStackTrace();}}return sb.toString();
}

ppt03转为图片

public static String ppt03ToImage(String from, String images) {StringBuilder sb = new StringBuilder();FileInputStream fis = null;FileOutputStream fos = null;HSLFSlideShow ppt = null;try {// 1.如果图片文件夹存在,删除重新创建之File imagePathFile = new File(images);if (imagePathFile.exists()) {FileUtils.deleteDirectory(imagePathFile);}imagePathFile.mkdirs();fis = new FileInputStream(from);ppt = new HSLFSlideShow(fis);// 获取PPT每页的大小(宽和高度)Dimension onePPTPageSize = ppt.getPageSize();// 获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转为一张张的播放片List<HSLFSlide> pptPageSlideList = ppt.getSlides();// 下面循环的主要功能是实现对PPT文件中的每一张幻灯片进行转换和操作for (int i = 0; i < pptPageSlideList.size(); i++) {// 这几个循环只要是设置字体为宋体,防止中文乱码,List<List<HSLFTextParagraph>> oneTextParagraphs = pptPageSlideList.get(i).getTextParagraphs();for (List<HSLFTextParagraph> list : oneTextParagraphs) {for (HSLFTextParagraph hslfTextParagraph : list) {List<HSLFTextRun> HSLFTextRunList = hslfTextParagraph.getTextRuns();for (int j = 0; j < HSLFTextRunList.size(); j++) {/** 如果PPT在WPS中保存过,则 HSLFTextRunList.get(j).getFontSize();的值为0或者26040,* 因此首先识别当前文本框内的字体尺寸是否为0或者大于26040,则设置默认的字体尺寸。**/// 设置字体大小Double size = HSLFTextRunList.get(j).getFontSize();if ((size <= 0) || (size >= 26040)) {HSLFTextRunList.get(j).setFontSize(20.0);}// 设置字体样式为宋体// String family=HSLFTextRunList.get(j).getFontFamily();// HSLFTextRunList.get(j).setFontFamily("宋体");int index = HSLFTextRunList.get(j).getFontIndex();String name = HSLFTextRunList.get(j).getFontFamily();HSLFTextRunList.get(j).setFontIndex(1);HSLFTextRunList.get(j).setFontFamily("宋体");log.info("ppt info:"+HSLFTextRunList.get(j).getRawText());}}}/*** 创建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);/*** 设置图片的存放路径和图片格式*/String imgName = images + File.separator + UuidUtil.getUUID() + ".jpg";sb.append(imgName);sb.append(",");fos = new FileOutputStream(imgName);/*** 图片文件保存的指定的目录中*/ImageIO.write(oneBufferedImage, "jpg", fos);}} catch (Exception e) {e.printStackTrace();} finally {try {if(null != fis) {fis.close();}if(null != ppt) {ppt.close();}if(null != fos){fos.close();}} catch (IOException e) {e.printStackTrace();}}return sb.toString();
}

(完)

在线预览文档简单例子相关推荐

  1. nopi word to html,C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)...

    由于项目需要,需要一个在线预览office的功能,小编一开始使用的是微软提供的方法,简单快捷,但是不符合小编开发需求, 就另外用了:将文件转换成html文件然后预览html文件的方法.对微软提供的方法 ...

  2. 【板栗糖GIS】怎么将网络上只能在线预览文档另存为pdf(插件篇)

    怎么将网络上只能在线预览文档另存为pdf(插件篇) 目录 1.使用插件,这里推荐FireShot,好用免费 2.安装该插件的方式 3.打开在线预览文档的网址 4.点击插件-截取整个页面并且-另存为pd ...

  3. html怎么转换到百度,类似百度文库在线预览文档flash版(支持word、excel、ppt、pdf)+在线预览文档html版...

    类似百度文库在线预览文档flash版(支持word.excel.ppt.pdf)+在线预览文档html版 (1).将文档转换为html,只支持支持office文档 (2).将文档转换为flash,实现 ...

  4. 前端页面预览word_前端实现在线预览文档

    前端实现在线预览文档 发布时间:2019-06-03 17:22, 浏览次数:529 <>前端实现在线预览文档 最近项目开发中需要实现在线预览Word,Excel,PowerPoint格式 ...

  5. 在线预览文档 Office Online

    前言 一直想学习做个在线预览文档的功能,今天使用Office Online Server 2016进行实现在线预览功能. 服务器版本选择:Office Online Server 2016搭配wind ...

  6. PHP 在线预览文档

    PHP 在线预览word.excel.ppt.pdf.txt等文档文件. PHP 在线预览文档 写代码比较少的方案. // PDF.text可以直接网页打开查看 // word.excel.ppt 文 ...

  7. OpenOffice在线预览文档

    使用OpenOffice在线预览文档 开发中遇到了一个需求,需要在线预览word文档,excel表格,pdf等等文件,于是经过一圈Google,发现了这个工具,openoffice会把文档转为pdf文 ...

  8. 前端实现在线预览文档

    前端实现在线预览文档 最近项目开发中需要实现在线预览Word,Excel,PowerPoint格式的文档,网上查找了很多资源,各说纷纭,但是在一一尝试之后只有使用微软的预览接口才能成功,其他的会出现各 ...

  9. java实现openoffice在线预览文档

    1.openoffice需要导入的jar包 jodconverter-core-3.0-beta-4.jar juh-3.2.1.jar jurt-3.2.1.jar ridl-3.2.1.jar u ...

最新文章

  1. pycharm配置远程调试docker
  2. Win64 驱动内核编程-25.X64枚举和隐藏内核模块
  3. 网页编程中的模态对话框
  4. IO多路复用select/poll/epoll详解以及在Python中的应用
  5. 反汇编学习笔记2 函数的本质
  6. 前复权后复权程序C# .net
  7. vue element-ui登录页面源码
  8. JSON.stringify转换Date不正确的解決方法
  9. 动词ing基本用法_如果实在分不清英语动名词和现在分词,那就直接学习-ing分词...
  10. 查找某节点的所有祖先☆
  11. Spring Cloud 知识 思维导图
  12. 拉里·佩奇 密歇根大学演讲
  13. [lammps教程]OVITO绘制原子应力云图
  14. 网易163邮箱和网易126邮箱有什么区别?
  15. Arduino STM32 JLink下载教程
  16. 小米摄像头上传云服务器,杜老师说群晖:小米云摄像头无法对接群晖存储解决方法...
  17. android 随手记代码,随手记之Android网络调试简要记录
  18. 标准H.460公私网穿越视频解决方案
  19. 5g通用模组是什么_GTI 5G通用模组计划正式启动了吗? 联想将重点发展5G是什么?...
  20. 20210725个人周复盘

热门文章

  1. getHibernateTemplate()(Spring中常用的hql查询方法)
  2. JAVA的Date类与Calendar类
  3. poj3258二分法
  4. 【推荐】.NET批量上传控件——HtmlInputFiles
  5. 构件与构架,我的理解
  6. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望
  7. android keyevent.java,dispatchKeyEvent简单理解
  8. python时间戳_Python-强大的模块功能库-No11
  9. axure删除的页面怎么恢复_微信删除好友怎么找回?快速恢复,真的不难
  10. java aop xml配置_spring AOP使用 xml配置