java实现office文件预览

小编 2026-07-06 阅读:544 评论:0
喜欢的朋友可以关注下,粉...

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

    

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

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

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


版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表