利用jacob实现Word转PDF

利用jacob转PDF,poi生成Word(注:仅支持windows平台,需要jacob-1.14.3-x64.dll文件,存放在C:\Windows\System32路径下)

一、步骤:

1.导入所需Jar包
2.生成Word文档
3.转为PDF文件

二、所需Jar包,如图:

三、生成Word文件代码:

// 返回Docx中需要替换的特殊字符,没有重复项
// 推荐传入正则表达式参数"\\$\\{[^{}]+\\}"
public ArrayList<String> getReplaceElementsInWord(String filePath, String regex) {
    String[] p = filePath.split("\\.");
    if (p.length > 0) {// 判断文件有无扩展名
        // 比较文件扩展名
        if (p[p.length - 1].equalsIgnoreCase("doc")) {
            ArrayList<String> al = new ArrayList<>();
            File file = new File(filePath);
            HWPFDocument document = null;
            try {
                InputStream is = new FileInputStream(file);
                document = new HWPFDocument(is);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Range range = document.getRange();
            String rangeText = range.text();
            CharSequence cs = rangeText.subSequence(0, rangeText.length());
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(cs);
            int startPosition = 0;
            while (matcher.find(startPosition)) {
                if (!al.contains(matcher.group())) {
                    al.add(matcher.group());
                }
                startPosition = matcher.end();
            }
            return al;
        } else if (p[p.length - 1].equalsIgnoreCase("docx")) {
            ArrayList<String> al = new ArrayList<>();
            XWPFDocument document = null;
            try {
                document = new XWPFDocument(POIXMLDocument.openPackage(filePath));
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 遍历段落
            Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
            while (itPara.hasNext()) {
                XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
                String paragraphString = paragraph.getText();
                CharSequence cs = paragraphString.subSequence(0, paragraphString.length());
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(cs);
                int startPosition = 0;
                while (matcher.find(startPosition)) {
                    if (!al.contains(matcher.group())) {
                        al.add(matcher.group());
                    }
                    startPosition = matcher.end();
                }
            }
            // 遍历表
            Iterator<XWPFTable> itTable = document.getTablesIterator();
            while (itTable.hasNext()) {
                XWPFTable table = (XWPFTable) itTable.next();
                int rcount = table.getNumberOfRows();
                for (int i = 0; i < rcount; i++) {
                    XWPFTableRow row = table.getRow(i);
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        String cellText = "";
                        cellText = cell.getText();
                        CharSequence cs = cellText.subSequence(0, cellText.length());
                        Pattern pattern = Pattern.compile(regex);
                        Matcher matcher = pattern.matcher(cs);
                        int startPosition = 0;
                        while (matcher.find(startPosition)) {
                            if (!al.contains(matcher.group())) {
                                al.add(matcher.group());
                            }
                            startPosition = matcher.end();
                        }
                    }
                }
            }
            return al;
        } else {
            return null;
        }
    } else {
        return null;
    }
}

// 替换word中需要替换的特殊字符
public static boolean replaceAndGenerateWord(String srcPath, String destPath, Map<String, String> map) {
    String[] sp = srcPath.split("\\.");
    String[] dp = destPath.split("\\.");
    if ((sp.length > 0) && (dp.length > 0)) {// 判断文件有无扩展名
        // 比较文件扩展名
        if (sp[sp.length - 1].equalsIgnoreCase("docx")) {
            try {
                XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath));
                // 替换段落中的指定文字
                Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
                while (itPara.hasNext()) {
                    XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
                    List<XWPFRun> runs = paragraph.getRuns();
                    for (int i = 0; i < runs.size(); i++) {
                        String onegaString = runs.get(i).getText(runs.get(i).getTextPosition());
                        for (Map.Entry<String, String> entry : map.entrySet()) {
                            onegaString = onegaString.replace(entry.getKey(), entry.getValue());
                        }
                        runs.get(i).setText(onegaString, 0);
                    }
                }
                // 替换表格中的指定文字
                Iterator<XWPFTable> itTable = document.getTablesIterator();
                while (itTable.hasNext()) {
                    XWPFTable table = (XWPFTable) itTable.next();
                    int remount = table.getNumberOfRows();
                    for (int i = 0; i < remount; i++) {
                        XWPFTableRow row = table.getRow(i);
                        List<XWPFTableCell> cells = row.getTableCells();
                        for (XWPFTableCell cell : cells) {
                            String cellTextString = cell.getText();
                            for (Map.Entry<String, String> e : map.entrySet()) {
                                if (cellTextString.contains(e.getKey()))
                                    cellTextString = cellTextString.replace(e.getKey(), e.getValue());
                            }
                            cell.removeParagraph(0);
                            cell.setText(cellTextString);
                        }
                    }
                }
                FileOutputStream outStream = null;
                outStream = new FileOutputStream(destPath);
                document.write(outStream);
                outStream.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            // doc只能生成doc,如果生成docx会出错
        } else if ((sp[sp.length - 1].equalsIgnoreCase("doc")) && (dp[dp.length - 1].equalsIgnoreCase("doc"))) {
                HWPFDocument document = null;
                try {
                    document = new HWPFDocument(new FileInputStream(srcPath));
                    Range range = document.getRange();
                    for (Map.Entry<String, String> entry : map.entrySet()) {
                        range.replaceText(entry.getKey(), entry.getValue());
                    }
                    FileOutputStream outStream = new FileOutputStream(destPath);
                    document.write(outStream);
                    outStream.close();
                    return true;
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    return false;
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            } else {
                return false;
            }
    } else {
        return false;
    }
}

四、Word转PDF代码:

public static void wordToPdf(String fromAddress, String toAddress) {
    ActiveXComponent ax = null;
    try {
        long startTime = System.currentTimeMillis();
        ax = new ActiveXComponent("Word.Application");
        //设置打开word文档不可见
        ax.setProperty("Visible", false);
        //获取Word文档中所有内容
        Dispatch docs = ax.getProperty("Documents").toDispatch();
        //打开word文档,并设置word为不可编辑和不需确认
        Dispatch doc = Dispatch.call(docs,
                "Open",
                fromAddress,// FileName
                false,// ConfirmConversions
                true // ReadOnly
        ).toDispatch();

        File tofile = new File(toAddress);
        if (tofile.exists()) {
            tofile.delete();
        }
        //word文件另存为pdf文件
        Dispatch.call(doc,//
                "SaveAs", //
                toAddress, // FileName
                wdFormatPDF);
        //关闭word文档
        Dispatch.call(doc, "Close", false);
        long endTime = System.currentTimeMillis();
        System.out.println("转化完成,总共耗时" + (endTime - startTime) + "ms。");
    } catch (Exception e) {
        System.out.println("========Error:文档转换失败:" + e.getMessage());
    } finally {
        if (ax != null)
            ax.invoke("Quit", new Variant[]{});
    }
}

注:代码于2017年编写,如有不兼容之处请联系我

原文地址:https://www.cnblogs.com/jack4519/p/12037513.html

时间: 2025-01-05 12:06:51

利用jacob实现Word转PDF的相关文章

百度文库的实现——java利用openoffice,word转pdf

百度文库的主要功能就是将上传的word文档,转码成pdf格式再展示出来.其中有四种方法可以实现这样的操作: 方法一:用apache pio 读取doc文件,然后转成html文件用Jsoup格式化html文件,最后用itext将html文件转成pdf. 方法2:使用jdoctopdf来实现,这是一个封装好的包,可以把doc转换成pdf,html,xml等格式,调用很方便需要注意中文字体的写入问题. 方法3:使用jodconverter来调用openOffice的服务来转换,openOffice有个

Java使用Jacob将Word、Excel、PPT转化成PDF

使用Jacob将金山WPS转化成PDF,其中WPS文字使用KWPS.Aplication.Excel表格是KET.Application.演示文档是KWPP.Application,废话不多说,直接上代码: 1 import com.jacob.activeX.ActiveXComponent; 2 import com.jacob.com.ComThread; 3 import com.jacob.com.Dispatch; 4 import com.jacob.com.Variant; 5

Java 将word转为pdf jacob方式

package com.doctopdf; import java.io.File; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * 效果最好的一种方法,但是需要 window 环境,而且速度是最慢的需要安装 msofficeWord * * 下载地址:http:

使用jacob打印word或excel

在看PDF打印的时候顺便也看了看word和excel的打印,这里只简单的知道如何使用,原理没有深究~ 首先这里只说打印,至于生成word或者excel,可以使用poi(jacob貌似也可以) JACOB是一个 JAVA到微软的COM接口的桥梁.使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象.如果你要对 MS Word.Excel 进行处理,JACOB 是一个好的选择. 而关于打印的话,总结起来有这么几个步骤. 1.使用Jacob创建 ActiveX部件对象:

[原创]java实现word转pdf

最近遇到一个项目需要把word 转成pdf,百度了一下网上的方案有很多,比如虚拟打印.给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这类java com bridge,使得服务器开发受限于win平台,而且部署起来也很麻烦.后来在某论坛看到了一个openoffice+jodconverter的转换方案,可以完成word到PDF的转换工作,服务器开发端需要安装openoffice,但是需求一步额外的操作--需要在服务器开发上的某个端口

java 将word转为PDF (100%与word软件转换一样)

jdk环境:jdk_8.0.1310.11_64    (64位) 1.引入pom文件 <!-- word转pdf(依赖microsoft) --> <dependency> <groupId>com.jacob</groupId> <artifactId>jacob</artifactId> <version>1.18</version> </dependency> 2.下载jar文件,手动添加至

WordtoPdfUtil word转pdf

jar: <dependency> <groupId>com.jacob</groupId> <artifactId>jacob</artifactId> <version>1.10</version> </dependency> 在tomcat上使用时要在tomcat使用的jdk的jdk/jre/bin目录下放置配套的jacob.dll文件 import java.io.File; import com.ja

Word转PDF

一 .安装libreoffice yum  install libreoffice 同时需要安装java运行环境 二.执行命令 将 /home/wordToPdf/wordFiles/目录下的CAS.docx转成pdf存放到 /home/wordToPdf/pdfFiles 目录下: libreoffice --headless --convert-to pdf:writer_pdf_Export /home/wordToPdf/wordFiles/CAS.docx --outdir /home

个人永久性免费-Excel催化剂功能第115波-word、pdf、Excel、ppt、html等文件互转

2020年第一波更新,再来个重量级的刚需场景,文件互转.有Excel催化剂后,不再需要频繁到处找寻各种网页在线版的转换操作,数据安全很重要,不要轻易将自己文件上传到网上,哪天出事了,没人可怜! 做最有价值的文件转换而非为转换而转换 文件转换的确是一个非常刚需的功能,滋生了大量的网页在线转换应用,当然也有不少是收费性质的,至于免费的也是有功能限制的如文件大小限制或转换页数限制. 因着没有过硬的数据管理能力,大量的本该在Excel上做结构化存储的数据,被分散地存储在pdf.word.甚至ppt上,这