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】大家一起讨论技术。
后面会不定时为大家更新文章,敬请期待。