zoukankan      html  css  js  c++  java
  • Java通过openOffice实现word,excel,ppt转成pdf实现在线预览

    相关博文来源:
    简书:java通过openOffice实现word,excel,ppt转成pdf实现在线预览
    博客园:java 如何将 word,excel,ppt如何转pdf --openoffice (1)
    博客园:Java使用Openoffice将word、ppt转换为PDF
    博客园:linux环境下安装 openOffice 并启动服务

    一、OpenOffice

    OpenOffice.org 是一套跨平台的办公室软件套件,能在 Windows、Linux、MacOS X (X11)、和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是自由软件,任何人都可以免费下载、使用、及推广它。

    1.1 下载地址

    http://www.openoffice.org/

    1.2 JodConverter

    jodconverter-2.2.2.zip 下载地址:
    http://sourceforge.net/projects/jodconverter/files/JODConverter/

    下载openOffce软件,安装相应系统版本,这里以windows为例
    添加maven依赖:

    <dependency>
         <groupId>com.artofsolving</groupId>
         <artifactId>jodconverter</artifactId>
         <version>2.2.1</version>
     </dependency>
     <dependency>
         <groupId>org.artofsolving.jodconverter</groupId>
         <artifactId>jodconverter-core</artifactId>
         <version>3.0-beta-4-jahia2</version>
     </dependency>
    

    第二个jar包可能有些资源库没有,下载后,直接放在项目中,直接在pom中加载项目内部jar包即可。

     <dependency>
        <groupId>org.artofsolving.jodconverter</groupId>
        <artifactId>jodconverter-core</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${basedir}/src/main/resources/lib/jodconverter-core.jar</systemPath>
    </dependency>
    

    1.3 新建实体类PDFDemo

    import java.io.File;
    import java.net.ConnectException;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.artofsolving.jodconverter.OfficeDocumentConverter;
    import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
    import org.artofsolving.jodconverter.office.OfficeManager;
    
    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.StreamOpenOfficeDocumentConverter;
    
    public class PDFDemo {
    
        public static boolean officeToPDF(String sourceFile, String destFile) {
            try {
    
                File inputFile = new File(sourceFile);
                if (!inputFile.exists()) {
                    // 找不到源文件, 则返回false
                    return false;
                }
                // 如果目标路径不存在, 则新建该路径
                File outputFile = new File(destFile);
                if (!outputFile.getParentFile().exists()) {
                    outputFile.getParentFile().mkdirs();
                }
                //如果目标文件存在,则删除
                if (outputFile.exists()) {
                    outputFile.delete();
                }
               // DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                
                DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
                // OpenOffice安装在本地环境的目录
                String officeHome = "D:\profiles\openOfice4";
                config.setOfficeHome(officeHome);
                config.setPortNumber(8100);
                config.setTaskExecutionTimeout(1000 * 60 * 5);// 设置任务执行超时为5分钟
                config.setTaskQueueTimeout(1000 * 60 * 60 * 24);// 设置任务队列超时为24小时
    
                OfficeManager officeManager = config.buildOfficeManager();
                officeManager.start();
    
                OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
                if (inputFile.exists()) {
                    // 进行PDF格式的转换
                    converter.convert(inputFile, outputFile);
                }
    
                officeManager.stop();
                
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        public static void main(String[] args) {
           boolean flag = officeToPDF("D:\testE.xls", "D:\test3.pdf");
           System.out.println(flag);
        }
    }
    

    上面officceToPDF方法的第一个参数是原文件路径,第二个参数是输出文件路径,后缀名改成html就转成html,后缀名是pdf就转成pdf

    上面的方法比较浪费性能 每次都要打开关闭,可以在服务器端开启soffice服务的方式直接调用连接会比较可行;
    去到安装目录的program文件夹 cmd打开,运行

    soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"-nofirststartwizard
    

    在这里插入图片描述

    可以上图看到进程已开启
    以下代码可调用:

    public static boolean officeToPDF(String sourceFilePath, String destFilePath) {
    
            boolean flag = false;
            //try {
                File inputFile = new File(sourceFilePath);
                if (!inputFile.exists()) {
                    // 找不到源文件, 则返回false
                    return flag;
                }
                // 如果目标路径不存在, 则新建该路径
                File outputFile = new File(destFilePath);
                if (!outputFile.getParentFile().exists()) {
                    outputFile.getParentFile().mkdirs();
                }
                // 如果目标文件存在,则删除
                if (outputFile.exists()) {
                    outputFile.delete();
                }
                // DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                try {
                    OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                    if (inputFile.exists()) {
                        // 进行PDF格式的转换
                        converter.convert(inputFile, outputFile);
                    }
                    connection.disconnect();
                    flag = true;
                } catch (Exception e) {
                    flag = false;
                    e.printStackTrace();
                }
                
                return flag;
        }
    

    二、实践代码二

    package indi.johnny.convert;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    
    import org.artofsolving.jodconverter.OfficeDocumentConverter;
    import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
    import org.artofsolving.jodconverter.office.OfficeManager;
    
    
    //转换文档为pdf
    public class OpenOfficePdfConvert {
    
        /**
         * @param args
         */
        private static OfficeManager officeManager;
        private static String OFFICE_HOME = "D:/software/OpenOffice 4/";
        private static int port[] = { 8100 };
        
        public void convert2PDF(String inputFile, String outputFile) throws FileNotFoundException {
           
            startService();
            System.out.println("进行文档转换转换:" + inputFile + " --> " + outputFile);
            
            OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
            converter.convert(new File(inputFile), new File(outputFile));
            
            stopService();
            System.out.println();
    
        }
    
        // 打开服务器
        public static void startService() {
            DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
            try {
                System.out.println("准备启动服务....");
                configuration.setOfficeHome(OFFICE_HOME);// 设置OpenOffice.org安装目录
                configuration.setPortNumbers(port); // 设置转换端口,默认为8100
                configuration.setTaskExecutionTimeout(1000 * 60 * 5L);// 设置任务执行超时为5分钟
                configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);// 设置任务队列超时为24小时
    
                officeManager = configuration.buildOfficeManager();
                officeManager.start(); // 启动服务
                System.out.println("office转换服务启动成功!");
            } catch (Exception ce) {
                System.out.println("office转换服务启动失败!详细信息:" + ce);
            }
        }
    
        // 关闭服务器
        public static void stopService() {
            System.out.println("关闭office转换服务....");
            if (officeManager != null) {
                officeManager.stop();
            }
            System.out.println("关闭office转换成功!");
        }
    
        public static void main(String[] args) throws Exception {
            String path = "C:/Users/johnny/Desktop/文档/20170420/test/001/";
            OpenOfficePdfConvert opc = new OpenOfficePdfConvert();
            opc.convert2PDF(path+"1.docx", path+"1.pdf");
        }
    
    }
    

    将代码中的 OFFICE_HOME换成自己的openoffice的安装路径,端口8100不用动。

    三、linux环境下安装 openOffice 并启动服务

    1. .http://www.openoffice.org/zh-cn/download/ 去官网链接下载linux版本的openOffice 以4.1.5 版本为例。
    2. 将压缩包上传至服务器上,并进行解压安装。
    1  tar -zxvf  对应的压缩包名字
    2  cd 进入解压后的 /zh-cn/RPMS
    3  yum localinstall *.rpm
    4  cd desktop-integration
    5  rpm -ivh openoffice4.1.5-redhat-menus-4.1.5-9789.noarch.rpm
    

    默认会安装在/opt目录下。

    1 /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard  临时启动
    2 nohup /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &  后台启动
    

    四、Java使用Openoffice将word、ppt转换为PDF

    4.1 Word转换

    启动OpenOffice的服务

    进入openoffice安装目录,通过cmd启动一个soffice服务,启动的命令是

    soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"

    如果觉得后台运行OpenOffice服务比较麻烦,可以通过

    4.2 运行代码

    public class PDFDemo {
    
        public static boolean officeToPDF(String sourceFile, String destFile) {
            try {
    
                File inputFile = new File(sourceFile);
                if (!inputFile.exists()) {
                    // 找不到源文件, 则返回false
                    return false;
                }
                // 如果目标路径不存在, 则新建该路径
                File outputFile = new File(destFile);
                if (!outputFile.getParentFile().exists()) {
                    outputFile.getParentFile().mkdirs();
                }
                //如果目标文件存在,则删除
                if (outputFile.exists()) {
                    outputFile.delete();
                }
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
                connection.connect();
                //用于测试openOffice连接时间
                System.out.println("连接时间:" + df.format(new Date()));
                DocumentConverter converter = new StreamOpenOfficeDocumentConverter(
                        connection);
                converter.convert(inputFile, outputFile);
                //测试word转PDF的转换时间
                System.out.println("转换时间:" + df.format(new Date()));
                connection.disconnect();
                return true;
            } catch (ConnectException e) {
                e.printStackTrace();
                System.err.println("openOffice连接失败!请检查IP,端口");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        public static void main(String[] args) {
            officeToPDF("E:\test.docx", "E:\test.pdf");
        }
    }
    

    4.3 Word、ppt转Html

    只需要将后缀名从.pdf改为.html即可。

    public static void main(String[] args) {
        officeToPDF("E:\test.docx", "E:\test.html");
    }
    

    4.4 Maven配置

    Maven依赖

    <dependency>
    	<groupId>com.artofsolving</groupId>
    	<artifactId>jodconverter</artifactId>
    	<version>2.2.1</version>
    </dependency>
    <dependency>
    	<groupId>org.openoffice</groupId>
    	<artifactId>jurt</artifactId>
    	<version>3.0.1</version>
    </dependency>
    <dependency>
    	<groupId>org.openoffice</groupId>
    	<artifactId>ridl</artifactId>
    	<version>3.0.1</version>
    </dependency>
    <dependency>
    	<groupId>org.openoffice</groupId>
    	<artifactId>juh</artifactId>
    	<version>3.0.1</version>
    </dependency>
    <dependency>
    	<groupId>org.openoffice</groupId>
    	<artifactId>unoil</artifactId>
    	<version>3.0.1</version>
    </dependency>
    <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-jdk14</artifactId>
    	<version>1.4.3</version>
    </dependency>
    

    Maven只有 2.2.1版本,2.2.1版本有一个问题,那就是不兼容docx和pptx,如果你们不使用jodconverter-2.2.2 中lib,而想要使用2.2.1版本,需要修改一下 BasicDocumentFormatRegistry 类中的 getFormatByFileExtension方法:

    新建包 com.artofsolving.jodconverter
    新建类BasicDocumentFormatRegistry,复制下面代码
    package com.artofsolving.jodconverter;

    /**
     * @author 李文浩
     * @date 2017/12/25
     */
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {
        private List documentFormats = new ArrayList();
    
        public BasicDocumentFormatRegistry() {
        }
    
        public void addDocumentFormat(DocumentFormat documentFormat) {
            this.documentFormats.add(documentFormat);
        }
    
        protected List getDocumentFormats() {
            return this.documentFormats;
        }
    
        public DocumentFormat getFormatByFileExtension(String extension) {
            if (extension == null) {
                return null;
            } else {
                if (extension.indexOf("doc") >= 0) {
                    extension = "doc";
                }
                if (extension.indexOf("ppt") >= 0) {
                    extension = "ppt";
                }
                if (extension.indexOf("xls") >= 0) {
                    extension = "xls";
                }
                String lowerExtension = extension.toLowerCase();
                Iterator it = this.documentFormats.iterator();
    
                DocumentFormat format;
                do {
                    if (!it.hasNext()) {
                        return null;
                    }
    
                    format = (DocumentFormat)it.next();
                } while(!format.getFileExtension().equals(lowerExtension));
    
                return format;
            }
        }
    
        public DocumentFormat getFormatByMimeType(String mimeType) {
            Iterator it = this.documentFormats.iterator();
    
            DocumentFormat format;
            do {
                if (!it.hasNext()) {
                    return null;
                }
    
                format = (DocumentFormat)it.next();
            } while(!format.getMimeType().equals(mimeType));
    
            return format;
        }
    }
    

    下面是增加的部分,仅仅增加了将docx按照doc的处理方式处理。而2.2.2版本已经默认增加了。

    if (extension.indexOf("doc") >= 0) {
        extension = "doc";
    }
    if (extension.indexOf("ppt") >= 0) {
        extension = "ppt";
    }
    if (extension.indexOf("xls") >= 0) {
        extension = "xls";
    }
    
  • 相关阅读:
    【EC】DropShipping
    【电商】淘宝商家论坛
    【电商】后台
    【产品】小龙的饭否记录
    【用研】00后这一代
    【产品】未来趋势
    【数据产品】flurry
    【产品思考】各产品春晚方案
    计算概论(二)计算机与程序运行基本原理
    计算概论(一)计算起源、图灵机、计算原理
  • 原文地址:https://www.cnblogs.com/aixing/p/13327082.html
Copyright © 2011-2022 走看看