不知觉就过了这个久了,继上篇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】大家一起讨论技术。

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

  

  

  

版权声明:本文为dsn727455218原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dsn727455218/p/9174230.html