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】大家一起讨论技术。

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

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

      

      

      

  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/dsn727455218/p/9174230.html
Copyright © 2011-2022 走看看