zoukankan      html  css  js  c++  java
  • 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】大家一起讨论技术。

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

    如果对你有帮助,请打赏一下!!!

      

      

      

  • 相关阅读:
    阿里云标准-Docker安全基线检查
    阿里云标准-Redis安全基线检查
    阿里云标准-Nginx安全基线检查
    python中urllib.request和requests的使用和区别
    python爬百度首页
    进行base64编码
    python基础入门 文件操作
    python面向对象编程: 搬家具案例
    在vi或vim上查找字符串
    浅析数据一致性
  • 原文地址:https://www.cnblogs.com/dsn727455218/p/9174230.html
Copyright © 2011-2022 走看看