java实现office文件预览
喜欢的朋友可以关注下,粉丝也缺。
不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能。
相信大家在平常的项目中会遇到需要对文件实现预览功能,这里不用下载节省很多事。大家请擦亮眼睛下面直接上代码了。
步骤:
1.需要下载openoffice插件,这是一款免费的工具,所以我们选择他。
2.需要pdf.js文件
这两个工具文件我下面会给地址需要的可以去下载
这是下载地址https://download.csdn.net/download/dsn727455218/10474679
不多说废话了,直接上代码了。
java预览工具类:
package com.file.utils; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.apache.log4j.Logger; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; import com.lowagie.text.Document; import com.lowagie.text.Image; import com.lowagie.text.PageSize; import com.lowagie.text.pdf.PdfWriter; /** * doc docx格式转换 */ public class DocConverter { private static final Logger logger = Logger.getLogger(DocConverter.class); private static final int environment = 1;// 环境 1:windows 2:linux private String fileString;// (只涉及pdf2swf路径问题) private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置 private String fileName; private static String[] docFileLayouts = { ".txt", ".doc", ".docx", ".wps", ".xls", ".xlsx", ".et", ".ppt", ".pptx", ".dps" };//office办公软件格式 private static String[] imgFileLayouts = { ".jpg", ".gif", ".jpeg", ".png", ".bmp" };//图片格式 private static String[] pdfFileLayouts = { ".pdf" };//pdf格式 private File imgFile; private File oldFile;//原文件 private File pdfFile; private File swfFile; private File docFile; private String pdf2swfPath; /** * 可预览的文件格式 * * @param baseAddition */ public static String getPreviewFileExt() { List list = new ArrayList(Arrays.asList(docFileLayouts)); list.addAll(Arrays.asList(imgFileLayouts)); list.addAll(Arrays.asList(pdfFileLayouts)); Object[] c = list.toArray(); //System.out.println(Arrays.toString(c)); return Arrays.toString(c); } public DocConverter(String fileurl) { ini(fileurl); } /** * 重新设置file * * @param fileString */ public void setFile(String fileurl) { ini(fileurl); } /** * 初始化 * * @param fileString */ private void ini(String fileurl) { this.fileString = fileurl; fileName = fileString.substring(0, fileString.lastIndexOf(".")); int type = fileString.lastIndexOf("."); String typeStr = fileString.substring(type); if (Arrays.toString(docFileLayouts).contains(typeStr)) { docFile = new File(fileString); } else if (Arrays.toString(imgFileLayouts).contains(typeStr)) { imgFile = new File(fileString); } else if (Arrays.toString(pdfFileLayouts).contains(typeStr)) { oldFile = new File(fileString); } pdfFile = new File(fileName + ".pdf"); } /** * 转为PDF * * @param file */ private void doc2pdf() throws Exception { if (docFile != null && docFile.exists()) { if (!pdfFile.exists()) { OpenOfficeConnection connection = new SocketOpenOfficeConnection("localhost", 8100); try { connection.connect(); DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(docFile, pdfFile); // close the connection connection.disconnect(); logger.info("****pdf转换成功,PDF输出:" + pdfFile.getPath() + "****"); } catch (java.net.ConnectException e) { e.printStackTrace(); logger.info("****swf转换器异常,openoffice服务未启动!****"); throw e; } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) { e.printStackTrace(); logger.info("****swf转换器异常,读取转换文件失败****"); throw e; } catch (Exception e) { e.printStackTrace(); throw e; } } else { logger.info("****已经转换为pdf,不需要再进行转化****"); } } else { logger.info("****swf转换器异常,需要转换的文档不存在,无法转换****"); } } /** * 将图片转换成pdf文件 imgFilePath 需要被转换的img所存放的位置。 * 例如imgFilePath="D:\\projectPath\\55555.jpg"; pdfFilePath 转换后的pdf所存放的位置 * 例如pdfFilePath="D:\\projectPath\\test.pdf"; * * @param image * @return * @throws IOException * @throws Exception */ private void imgToPdf() throws Exception { if (imgFile != null && imgFile.exists()) { if (!pdfFile.exists()) { Document document = new Document(); FileOutputStream fos = null; try { fos = new FileOutputStream(pdfFile.getPath()); PdfWriter.getInstance(document, fos); // 添加PDF文档的某些信息,比如作者,主题等等 //document.addAuthor("arui"); //document.addSubject("test pdf."); // 设置文档的大小 document.setPageSize(PageSize.A4); // 打开文档 document.open(); // 写入一段文字 // document.add(new Paragraph("JUST TEST ...")); // 读取一个图片 Image image = Image.getInstance(imgFile.getPath()); float imageHeight = image.getScaledHeight(); float imageWidth = image.getScaledWidth(); int i = 0; while (imageHeight > 500 || imageWidth > 500) { image.scalePercent(100 - i); i++; imageHeight = image.getScaledHeight(); imageWidth = image.getScaledWidth(); System.out.println("imageHeight->" + imageHeight); System.out.println("imageWidth->" + imageWidth); } image.setAlignment(Image.ALIGN_CENTER); // //设置图片的绝对位置 // image.setAbsolutePosition(0, 0); // image.scaleAbsolute(500, 400); // 插入一个图片 document.add(image); } catch (Exception de) { System.out.println(de.getMessage()); } document.close(); fos.flush(); fos.close(); } } } /** * 转换成 pdf */ @SuppressWarnings("unused") private void pdfTopdf() throws Exception { Runtime r = Runtime.getRuntime(); if (!pdfFile.exists() && oldFile.exists()) { if (environment == 1) {// windows环境处理 try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldFile.getPath()); if (oldfile.exists()) { // 文件存在时 InputStream inStream = new FileInputStream(oldFile.getPath()); // 读入原文件 FileOutputStream fs = new FileOutputStream(pdfFile.getPath()); byte[] buffer = new byte[1444]; int length; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; // 字节数 文件大小 System.out.println(bytesum); fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { logger.info("复制单个文件操作出错"); e.printStackTrace(); } } else if (environment == 2) {// linux环境处理 } } else { logger.info("****pdf不存在,无法转换****"); } } /** * 转换成 swf */ @SuppressWarnings("unused") private void pdf2swf() throws Exception { Runtime r = Runtime.getRuntime(); if (!swfFile.exists()) { if (pdfFile.exists()) { if (environment == 1) {// windows环境处理 try { // 从配置文件获取swfFile.exe 安装路径 InputStream in = DocConverter.class.getClassLoader() .getResourceAsStream("parameters/flow/pdf2swfPath.properties"); Properties config = new Properties(); try { config.load(in); in.close(); } catch (IOException e) { System.err.println("No AreaPhone.properties defined error"); } if (config != null && config.getProperty("pdf2swfPath") != null) { pdf2swfPath = config.getProperty("pdf2swfPath").toString(); } Process p = r .exec(pdf2swfPath + " " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); swfFile = new File(swfFile.getPath()); //System.out.print(loadStream(p.getInputStream())); //System.err.print(loadStream(p.getErrorStream())); //System.out.print(loadStream(p.getInputStream())); System.err.println("****swf转换成功,文件输出:" + swfFile.getPath() + "****"); /* * if (pdfFile.exists()) { pdfFile.delete(); } */ } catch (IOException e) { e.printStackTrace(); throw e; } } else if (environment == 2) {// linux环境处理 try { Process p = r.exec("pdf2swf " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); //System.out.print(loadStream(p.getInputStream())); //System.err.print(loadStream(p.getErrorStream())); System.err.println("****swf转换成功,文件输出:" + swfFile.getPath() + "****"); /* * if (pdfFile.exists()) { pdfFile.delete(); } */ } catch (Exception e) { e.printStackTrace(); throw e; } } } else { System.out.println("****pdf不存在,无法转换****"); } } else { System.out.println("****swf已经存在不需要转换****"); } } static String loadStream(InputStream in) throws IOException { int ptr = 0; in = new BufferedInputStream(in); StringBuffer buffer = new StringBuffer(); while ((ptr = in.read()) != -1) { buffer.append((char) ptr); } return buffer.toString(); } /** * 转换主方法 */ @SuppressWarnings("unused") public boolean conver() { if (pdfFile.exists()) { logger.info("****swf转换器开始工作,该文件已经转换为swf****"); return true; } if (environment == 1) { logger.info("****swf转换器开始工作,当前设置运行环境windows****"); } else { logger.info("****swf转换器开始工作,当前设置运行环境linux****"); } try { doc2pdf(); imgToPdf(); pdfTopdf(); //pdf2swf(); } catch (Exception e) { e.printStackTrace(); return false; } if (pdfFile.exists()) { return true; } else { return false; } } public static void main(String[] args) { // 调用转换类DocConverter,并将需要转换的文件传递给该类的构造方法 /* * DocConverter d = new * DocConverter("C:/Users/Administrator/Desktop/工作动态第19期.pdf"); // * 调用conver方法开始转换,先执行doc2pdf()将office文件转换为pdf;再执行pdf2swf()将pdf转换为swf; * d.conver(); // 调用getswfPath()方法,打印转换后的swf文件路径 * System.out.println(d.getswfPath()); */ } /** * 返回文件路径 * * @param s */ public String getPdfName() { //if (swfFile.exists()) { String tempString = pdfFile.getName(); //tempString = tempString.replaceAll("\\\\", "/"); return tempString; /* * } else { return ""; } */ } /** * 设置输出路径 */ public void setOutputPath(String outputPath) { this.outputPath = outputPath; if (!outputPath.equals("")) { String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf(".")); if (outputPath.charAt(outputPath.length()) == '/') { swfFile = new File(outputPath + realName + ".swf"); } else { swfFile = new File(outputPath + realName + ".swf"); } } } }
是不是觉得很简单,这里需要说明的一个问题是,连接openoffice服务如果用:
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); OpenOfficeConnection connection = new SocketOpenOfficeConnection("localhost", 8100);
第一种会报错,连接失败,具体错误代码我就不贴,不信可以试试看,所以我们选择第二种连接方式。
aciton中调用:
@ResponseBody @RequestMapping(value = "/onlinefile") public void onlinefile(Logonlog logonlog, FileList user, HttpServletRequest request, HttpServletResponse response, HttpSession session, String msg) throws Exception { response.setHeader("Access-Control-Allow-Origin", "*"); String fileurl = request.getParameter("fileurl"); if ("".equals(Tools.RmNull(fileurl))) { msg = StatusCode.PARAMETER_NULL; } else { String filePath = request.getSession().getServletContext().getRealPath("/") + "\\upload\\"; DocConverter d = new DocConverter(filePath + fileurl);//调用的方法同样需要传文件的绝对路径 d.conver();//d.getPdfName()是返回的文件名 需要加上项目绝对路径 不然会以相对路径访问资源 session.setAttribute("fileurl", "/filemanagement/upload/" + d.getPdfName());//设置文件路径 response.sendRedirect("/filemanagement/file/showinfo.jsp");//跳转到展示页面 } }
jsp页面:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page language="java" import="javax.servlet.http.HttpSession"%> <% String fileurl=session.getAttribute("fileurl").toString(); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>预览</title> </head> <body> <!--内容--> <div class="mim_content"> <iframe width="100%"height="700px" src="/filemanagement/online/viewer.html?file=${fileurl}"></iframe> </div> </body> </html>
这里我们是需要的文件传到pdf.js文件里面才能展示的:
viewer.html 是一个官方文件 下载来用就可以
我就不贴代码,需要文件的可以去我的下载地址下载文件以及工具包
https://download.csdn.net/download/dsn727455218/10474679 这是下载地址
实现文件的预览其实就是这么的简单,这里需要给大家说明一点,需要先启动openoffice服务,不然会报错的。
当然还有一些其他的方式 比如 poi,以及使用office web 365第三方服务 但是这是收费的有钱任性的可以试试。;
到这里已经完成了对文件的预览功能,如有需要可以加我Q群【308742428】大家一起讨论技术。
后面会不定时为大家更新文章,敬请期待。
喜欢的朋友可以关注下,粉丝也缺。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OkHttp's NullPointerException in HttpUrl.class
1 java.lang.RuntimeException:Unable to resume activity {com.xxxx.center/com.xxxx.center.activity.LoadActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference 2 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3284) 3 ...... 4 java.lang.NullPointerException:Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference 5 okhttp3.HttpUrl.canonicalize(HttpUrl.java:1612) 6 o...
- 下一篇
WebAssembly 应用案例直击,谷歌地球都在用
目前 WebAssembly 已经开始在哪些场景中应用了?不妨从这 7 个 WebAssembly 应用一探究竟! 事实上,WebAssembly 最大的优点莫过于可大幅度提升 Javascript 的性能。 WebAssembly 的设计目标:定义一个可移植,体积紧凑,加载迅速的二进制格式为编译目标,而此二进制格式文件将可以在各种平台(包括移动设备和物联网设备)上被编译,然后发挥通用的硬件性能以原生应用的速度运行。 除了浏览器开发者和游戏开发者大力支持 WebAssembly 外,许多需要提升性能表现的大型网页应用或线上工具,都可从 WebAssembly 的超快运行速度中受益。那么目前 WebAssembly 已经开始应用在哪些场景了呢?我们不妨从下面 8 个 WebAssembly 应用一探究竟。其中,有些应用已在 GitHub 上提供源码,可供我们参考,以打造自己的 WebAssembly 应用。 1. TeaVM — 将 JVM 字节码翻译成 JavaScript 和 WebAssembly https://www.oschina.net/p/teavm TeaVM 是一个 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果