博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java实现office文件预览
阅读量:6260 次
发布时间:2019-06-22

本文共 14769 字,大约阅读时间需要 49 分钟。

喜欢的朋友可以关注下,粉丝也缺。

    

    不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能。

    相信大家在平常的项目中会遇到需要对文件实现预览功能,这里不用下载节省很多事。大家请擦亮眼睛下面直接上代码了。

    步骤:

    1.需要下载openoffice插件,这是一款免费的工具,所以我们选择他。

    2.需要pdf.js文件

    这两个工具文件我下面会给地址需要的可以去下载

    这是下载地址

    不多说废话了,直接上代码了。

    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(); %>
预览

这里我们是需要的文件传到pdf.js文件里面才能展示的:

viewer.html 是一个官方文件 下载来用就可以

我就不贴代码,需要文件的可以去我的下载地址下载文件以及工具包

 这是下载地址

实现文件的预览其实就是这么的简单,这里需要给大家说明一点,需要先启动openoffice服务,不然会报错的。

当然还有一些其他的方式 比如 poi,以及使用office web 365第三方服务 但是这是收费的有钱任性的可以试试。;

到这里已经完成了对文件的预览功能,如有需要可以加我Q群【308742428】大家一起讨论技术。

后面会不定时为大家更新文章,敬请期待。

喜欢的朋友可以关注下,粉丝也缺。

转载地址:http://lohsa.baihongyu.com/

你可能感兴趣的文章
对Map按key和value分别排序
查看>>
Async Performance: Understanding the Costs of Async and Await
查看>>
POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)
查看>>
Linux中select poll和epoll的区别
查看>>
Cocos2d-x之MenuItem
查看>>
远程共享文件夹
查看>>
[转] C/C++中printf和C++中cout的输出格式
查看>>
swift 如何实现点击view后显示灰色背景
查看>>
【Android】3.9 覆盖物功能
查看>>
MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
查看>>
搭建SolrCloud的详细步骤
查看>>
svn的安装与使用
查看>>
基于Linux下Iptables限制BT下载的研究
查看>>
Android对话框-中篇-之建立自己的对话框
查看>>
华为交换机VRP用户界面配置及Telnet登录实验
查看>>
作为一个程序员我最大的遗憾
查看>>
《SolidWorks 2012中文版从入门到精通》一6.5 综合实例——斜齿圆柱齿轮
查看>>
storm集群的监控
查看>>
RHCE 6.0学习笔记-2 RHEL 6 使用光盘配置本地YUM源
查看>>
Mongodb定期备份
查看>>