• office 文档转pdf


     本地先安装 金山wps,并确保可用

    工程目录

    1、使用前,先执行install.bat 安装jacob 到maven本地仓库

    2、复制

    jacob-1.18-M2-x64.dll
    jacob-1.18-M2-x86.dll

    到jdk的bin目录

     

     maven的pom.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cn.xiaojf.util</groupId>
        <artifactId>office-converter-util</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>jacob</groupId>
                <artifactId>jacob</artifactId>
                <version>1.18-M2</version>
            </dependency>
    
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.5</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.5</version>
            </dependency>
        </dependencies>
    </project>

    工具类

    package cn.xiaojf.util;
    
    import java.io.File;
    import java.util.UUID;
    
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.Dispatch;
    import com.jacob.com.Variant;
    import org.apache.commons.lang3.StringUtils;
    
    /**
     * office 文档转换成pdf工具类,通过jacob调用wps转换文档
     * @author xiaojf 2017/12/2 8:29
     */
    public class OfficeConverterUtil {
    
        private static final int WDFO_RMATPDF = 17;
        private static final int XLTYPE_PDF = 0;
        private static final int PPT_SAVEAS_PDF = 32;
        public static final int WORD_HTML = 8;
        public static final int WORD_TXT = 7;
        public static final int EXCEL_HTML = 44;
        public static final int PPT_SAVEAS_JPG = 17;
        // private static final int msoTrue = -1;
        // private static final int msofalse = 0;
    
        private static ActiveXComponent wordApp = null;
        private static ActiveXComponent excelApp = null;
        private static ActiveXComponent pptApp = null;
        private static ActiveXComponent ppApp = null;
    
        static {
            wordApp = new ActiveXComponent("Word.Application");
            wordApp.setProperty("Visible", new Variant(false));
    
            excelApp = new ActiveXComponent("Excel.Application");
            excelApp.setProperty("Visible", false);
    
            pptApp = new ActiveXComponent("KWPP.Application");
            ppApp = new ActiveXComponent("PowerPoint.Application");
        }
    
        /**
         * office文件转换成pdf,根据后缀名识别转换类型
         * @param inputFilePath 输入文件绝对路径
         * @param pdfPath 输出文件绝对路径
         * @return 转换是否成功,true 成功,false 不成功
         * @author xiaojf 2017/12/2 8:30
         */
        public static boolean officeFileConverterToPdf(String inputFilePath, String pdfPath) {
            if (StringUtils.isBlank(inputFilePath) || StringUtils.isBlank(pdfPath) || StringUtils.isBlank(getFileSufix(inputFilePath))) {
                return false;
            }
    
            String suffix = getFileSufix(inputFilePath);
    
            File file = new File(inputFilePath);
            if (!file.exists()) {
                return false;
            }
    
            // PDF如果不存在则创建文件夹
            file = new File(getFilePath(pdfPath));
            if (!file.exists()) {
                file.mkdir();
            }
    
            // 如果输入的路径为PDF 则生成失败
            if (suffix.equals("pdf")) {
                System.out.println("PDF not need to convert!");
                return false;
            }
    
            if (suffix.equals("doc") || suffix.equals("docx") || suffix.equals("txt")) {
                return wordToPDF(inputFilePath, pdfPath);
            } else if (suffix.equals("xls") || suffix.equals("xlsx")) {
                return excelToPdf(inputFilePath, pdfPath);
            } else if (suffix.equals("ppt") || suffix.equals("pptx")) {
                return pptToPdf(inputFilePath, pdfPath);
                // return ppt2PDF(argInputFilePath, argPdfPath);
            }
    
            return false;
        }
    
        /**
         * word 转 pdf
         * @param wordPath 输入文件绝对路径
         * @param pdfPath 输出文件绝对路径
         * @return 转换是否成功,true 成功,false 不成功
         * @author xiaojf 2017/12/2 8:30
         */
        public static boolean wordToPDF(String wordPath, String pdfPath) {
    
            try {
                Dispatch docs = Dispatch.get(wordApp, "Documents").toDispatch();
                // long pdfStart = System.currentTimeMillis();
                Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method,
                        new Object[]{wordPath, new Variant(false), new Variant(true)}, new int[1]).toDispatch();
    
                deletePdf(pdfPath);
    
                Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{pdfPath, new Variant(WDFO_RMATPDF)},
                        new int[1]);
                // long pdfEnd = System.currentTimeMillis();
                if (null != doc) {
                    Dispatch.call(doc, "Close", false);
                }
            } catch (Exception e) {
                e.printStackTrace();
    
            } /*
                 * finally { wordApp.invoke("Quit"); }
                 */
            return true;
        }
    
        /**
         * excel 转 pdf
         * @param inputFile 输入文件绝对路径
         * @param pdfFile 输出文件绝对路径
         * @return 转换是否成功,true 成功,false 不成功
         * @author xiaojf 2017/12/2 8:30
         */
        public static boolean excelToPdf(String inputFile, String pdfFile) {
    
            try {
    
                deletePdf(pdfFile);
    
                Dispatch excels = excelApp.getProperty("Workbooks").toDispatch();
                Dispatch excel = Dispatch.call(excels, "Open", inputFile, false, true).toDispatch();
                Dispatch.call(excel, "ExportAsFixedFormat", XLTYPE_PDF, pdfFile);
                Dispatch.call(excel, "Close", false);
            } catch (Exception e) {
                e.printStackTrace();
            } /*
                 * finally { excelApp.invoke("Quit"); }
                 */
            return true;
        }
    
        /**
         * ppt 转 pdf
         * @param inputFile 输入文件绝对路径
         * @param pdfFile 输出文件绝对路径
         * @return 转换是否成功,true 成功,false 不成功
         * @author xiaojf 2017/12/2 8:30
         */
        public static boolean pptToPdf(String inputFile, String pdfFile) {
            // ComThread.InitSTA(true);
    
            try {
                // app.setProperty("Visible", false);
                Dispatch ppts = pptApp.getProperty("Presentations").toDispatch();
                Dispatch ppt = Dispatch.call(ppts, "Open", inputFile, true, // ReadOnly
                        // false, // Untitled指定文件是否有标题
                        false// WithWindow指定文件是否可见
                ).toDispatch();
                Dispatch.invoke(ppt, "SaveAs", Dispatch.Method, new Object[]{pdfFile, new Variant(PPT_SAVEAS_PDF)},
                        new int[1]);
                Dispatch.call(ppt, "Close");
            } catch (Exception e) {
                e.printStackTrace();
            } /*
                 * finally { pptApp.invoke("Quit"); }
                 */
    
            return true;
        }
    
        /**
         * ppt 转 图片
         * @param inputFile 输入文件绝对路径
         * @param imgFile 输出文件绝对路径
         * @return 转换是否成功,true 成功,false 不成功
         * @author xiaojf 2017/12/2 8:30
         */
        public static boolean pptToImg(String inputFile, String imgFile) {
            // 打开word应用程序
    
            try {
                // 设置word不可见,office可能有限制
                // app.setProperty("Visible", false);
                // 获取word中国所打开的文档,返回Documents对象
                Dispatch files = ppApp.getProperty("Presentations").toDispatch();
                // 调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
                Dispatch file = Dispatch.call(files, "open", inputFile, true, true, false).toDispatch();
                // 调用Document对象的SaveAs方法,将文档保存为pdf格式
                // Dispatch.call(doc, "ExportAsFixedFormat", outputFile,
                // PPT_TO_PDF);
                Dispatch.call(file, "SaveAs", imgFile, PPT_SAVEAS_JPG);
                // 关闭文档
                // Dispatch.call(file, "Close", false);
                Dispatch.call(file, "Close");
                // 关闭word应用程序
                // app.invoke("Quit", 0);
            } catch (Exception e) {
                e.printStackTrace();
            } /*
                 * finally { ppApp.invoke("Quit"); }
                 */
    
            return true;
        }
    
        /**
         * 获取文件扩展名
         * @param filePath
         * @author xiaojf 2017/12/2 8:35
         */
        public static String getFileSufix(String filePath) {
            int splitIndex = filePath.lastIndexOf(".");
            return filePath.substring(splitIndex + 1);
        }
    
        /**
         * 获取文件路径
         * @param filePath
         * @author xiaojf 2017/12/2 8:37
         */
        public static String getFilePath(String filePath) {
            int pathIndex = filePath.lastIndexOf("/");
            return filePath.substring(0, pathIndex);
        }
    
        /**
         *  如果目标文件存在,则删除
         *  @param pdfPath
         * @author xiaojf 2017/12/2 8:34
         */
        private static void deletePdf(String pdfPath) {
            File pdfFile = new File(pdfPath);
            if (pdfFile.exists()) {
                pdfFile.delete();
            }
        }
    
        public static void main(String[] args) {
            OfficeConverterUtil.wordToPDF("D:\word2pdf\1.doc",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".doc.pdf");
            OfficeConverterUtil.wordToPDF("D:\word2pdf\1.docx",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".docx.pdf");
            OfficeConverterUtil.pptToPdf("D:\word2pdf\1.ppt",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".ppt.pdf");
            OfficeConverterUtil.pptToPdf("D:\word2pdf\1.pptx",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".pptx.pdf");
            OfficeConverterUtil.wordToPDF("D:\word2pdf\1.rtf",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".rtf.pdf");
            OfficeConverterUtil.wordToPDF("D:\word2pdf\1.txt",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".txt.pdf");
            OfficeConverterUtil.excelToPdf("D:\word2pdf\1.xls",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".xls.pdf");
            OfficeConverterUtil.excelToPdf("D:\word2pdf\1.xlsx",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".xlsx.pdf");
    
    
            OfficeConverterUtil.pptToImg("D:\word2pdf\1.ppt",
                    "D:\word2pdf\pdf\" + UUID.randomUUID().toString() + ".ppt.jpg");
    
    
            wordApp.invoke("Quit");
            wordApp.safeRelease();
            excelApp.invoke("Quit");
            excelApp.safeRelease();
            pptApp.invoke("Quit");
            pptApp.safeRelease();
            ppApp.invoke("Quit");
            ppApp.safeRelease();
    
        }
    
    }

    转前

    转后

     

    源码下载

    https://gitee.com/xiaojf/office-converter-util.git
  • 相关阅读:
    金蝶用户组权限语句
    金蝶物料更改保质期控制状态
    cisco+pppoe拨号配置教程
    FormFile上传文件代码(修改)
    试用django 和 rgraph 简单记录
    一闪而过的远程桌面
    用 python matplotlib 画图 简单记录
    去除UTL_FILE导致的ORA12012 ORA04068 ORA04063 ORA06508
    python mysqldb模块安装
    canvas绘制圆形
  • 原文地址:https://www.cnblogs.com/xiaojf/p/7953392.html
Copyright © 2020-2023  润新知