欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 实现word文件转pdf文件

程序员文章站 2024-03-17 15:26:34
...

这篇文章一共有两种方式实现word文件转pdf文件:

1、jacob    仅支持windows下转换,需要下载jacob-1.14.3-x64.dll 插件

2、OpenOffice   支持windows和linux,需要下载openffice

一、通过jacob方式

*只能在windows环境下使用

1.maven依赖

<dependency>
    <groupId>net.sf.jacob-project</groupId>
    <artifactId>jacob</artifactId>
    <version>1.14.3</version>
</dependency>

2.实现代码:

public void wordToPDF(String sfileName, String toFileName) {
        System.out.println("启动 Word...");
        long start = System.currentTimeMillis();
        ActiveXComponent app = null;
        Dispatch doc = null;
        try {
            app = new ActiveXComponent("Word.Application");
            app.setProperty("Visible", new Variant(false));
            Dispatch docs = app.getProperty("Documents").toDispatch();
            doc = Dispatch.call(docs, "Open", sfileName).toDispatch();
            System.out.println("打开文档..." + sfileName);
            System.out.println("转换文档到 PDF..." + toFileName);
            File tofile = new File(toFileName);
            if (tofile.exists()) {
                tofile.delete();
            }
            Dispatch.call(doc, "SaveAs", toFileName, // FileName
                    17);
            long end = System.currentTimeMillis();
            System.out.println("转换完成..用时:" + (end - start) + "ms.");

        } catch (Exception e) {
            System.out.println("========Error:文档转换失败:" + e.getMessage());
        } finally {
            Dispatch.call(doc, "Close", false);
            System.out.println("关闭文档");
            if (app != null) {
                app.invoke("Quit", new Variant[]{});
            }
        }
        // winword.exe进程关闭
        ComThread.Release();
    }

说明:

       需要下载  jacob-1.14.3-x64.dll文件,放到   jdk1.8.0_131\jre\bin

    

二、使用Openoffice转换

  *该方法可以自动开启openoffice,linux和windows都可以使用

 1.需要的maven依赖

<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.1</version>
</dependency>

2.实现代码:

public static int office2PDF(String sourceFile, String destFile) {
        try {
            System.out.println(sourceFile);
            File inputFile = new File(sourceFile);
            if (!inputFile.exists()) {
                return -1;// 找不到源文件, 则返回-1
            }
            System.out.println("找不到源文件, 则返回-1");
            // 如果目标路径不存在, 则新建该路径
            File outputFile = new File(destFile);
            if (!outputFile.getParentFile().exists()) {
                outputFile.getParentFile().mkdirs();
            }
            System.out.println("文件创建结束");
            String OpenOffice_HOME = "C:\\Program Files (x86)\\OpenOffice 4\\program";//这里是OpenOffice的安装目录, 在我的项目中,为了便于拓展接口,没有直接写成这个样子,但是这样是绝对没问题的
            // 如果从文件中读取的URL地址最后一个字符不是 '\',则添加'\'
            if (OpenOffice_HOME.charAt(OpenOffice_HOME.length() - 1) != '\\') {
                OpenOffice_HOME += "\\";
            }
            // 启动OpenOffice的服务
            String command = OpenOffice_HOME
                    + "soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
            Process pro = Runtime.getRuntime().exec(command);
            OpenOfficeConnection connection = new SocketOpenOfficeConnection(
                    "127.0.0.1", 8100);
            connection.connect();
            DocumentConverter converter = new OpenOfficeDocumentConverter(
                    connection);
            System.out.println("ing...");
            converter.convert(inputFile, outputFile);

            // close the connection
            connection.disconnect();
            // 关闭OpenOffice服务的进程
            pro.destroy();

            return 0;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return -1;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return 1;
    }

说明:

        需要下载安装openoffic,替换方法中加粗的地址



附:xml格式的word文档转换为标准格式的文档,但是只支持在windows环境下

        soursePath:源文件路径    

        targetPath:转换的目标文件路径

public static void docToDocx(String sourcePath, String targetPath){
        //Word.Application代表COM OLE编程标识,可查询MSDN得到
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        //设置Word不可见
        app.setProperty("Visible",false);
        //调用Application对象的Documents属性,获得Documents对象
        Dispatch docs = app.getProperty("Documents").toDispatch();
        Dispatch doc = Dispatch.call(docs,"Open",sourcePath).getDispatch();
        Dispatch.call(doc,"SaveAS",targetPath,12);
        //关闭打开的Word文件
        Dispatch.call(doc,"Close",false);
        //关闭Word应用程序
        app.invoke("Quit",0);
    }