不知觉就过了这个久了,继上篇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("\\\\", "http://www.likecs.com/"); return tempString; /* * } else { return ""; } */ } /** * 设置输出路径 */ public void setOutputPath(String outputPath) { this.outputPath = outputPath; if (!outputPath.equals("")) { String realName = fileName.substring(fileName.lastIndexOf("http://www.likecs.com/"), fileName.lastIndexOf(".")); if (outputPath.charAt(outputPath.length()) == 'http://www.likecs.com/') { swfFile = new File(outputPath + realName + ".swf"); } else { swfFile = new File(outputPath + realName + ".swf"); } } } }