使用JACOB操作word文档并实现打印

由于项目需要,需要在后台对word文档中的书签进行重新填值,并进行打印。一开始已经使用Spire.Doc for Java实现了这个效果,但是这个插件是收费的,公司不想买,于是就在网上找了一段时间开源的插件,最终用了JACOB这个插件。下面记录一下实现的方法

1、使用准备

        jacob下载地址:https://github.com/freemansoft/jacob-project/releases

        由于本人的开发环境为jdk1.7,故下载的jacob版本为Release 1.18版本,1.19、1.20版本需更高的jdk版本支持。

        下载成功之后,解压完成后会有一个.jar文件,俩个.dll文件。jar文件需放入到自己的项目中,dll文件分别放入到 jdk/bin 目录下和 jdk/jre/bin 的目录下(俩个dll文件一个支持64位系统,一个支持32位系统,根据自己的操作系统选择)。网上还有人说需要放在tomcat的bin目录下,本人并没有放但是也可以。

2、代码部分:

public static void main(String[] args) throws IOException {
        jacobPrintWord();
}

//打印文件
    private static void jacobPrintWord() {
        ComThread.InitSTA();
        //输入的文件路径
        String openPath = "D:\\_tmp\\_printlog\\文件表头和内容和变更记录模板1.0 - 副本.doc";
        //输出的文件路径
        String toFileName = "D:\\_tmp\\_printlog\\新模板测试1.doc";
        //启动word
        ActiveXComponent app = null;
        Dispatch doc = null;
        Dispatch docs = null;
        try {
            if (app == null || app.m_pDispatch == 0) {
                app = new ActiveXComponent("Word.Application");
                app.setProperty("Visible", new Variant(false));//不可见打开word
                app.setProperty("DisplayAlerts", new Variant(false));
                app.setProperty("AutomationSecurity", new Variant(3)); //禁用宏
            }
            if (docs == null) {
                // 获得documents对象
                docs = app.getProperty("Documents").toDispatch();
            }
            doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{openPath, new Variant(false), new Variant(true)}, new int[1])
                    .toDispatch();
            System.out.println("打开文档..." + openPath);

            //获取文档内所有的书签,并放到List数组中
            Dispatch book_marks = app.call(doc, "Bookmarks").toDispatch();
            int bCount = Dispatch.get(book_marks, "Count").getInt();  //获取书签数量
            List<String> bookMarks = new ArrayList<String>();
            for (int i = 1; i <= bCount; i++) {
                System.out.println(i);
                Dispatch items = Dispatch.call(book_marks, "Item", i).toDispatch();
                //书签名称
                String bookMarkKey = String.valueOf(Dispatch.get(items, "Name").getString()).replaceAll("null", "");   //读取书签命名
                System.out.println("bookMarkKey==" + bookMarkKey);
                bookMarks.add(bookMarkKey);
            }
            //循环书签并进行书签赋值
            //BEGIN_DATE,BEGIN_DATE1,BTYW,FILE_NUMBER,FJBBH,FJBBH1,FJBBH2,FJBBH3,FJBBH4,FJBBH5,FJBBH6,FJBH,FJBH1,FJBH2,FJBH3
            //FJBH4,FJBH5,FJBH6,gao,GMP_NAME,PIZHUNREN,QA_DATE,REVIEWERNAME,STOP_DATE,TICHUREN,TICHUREN_DATE,VERSION
            for (int i = 0; i < bookMarks.size(); i++) {
                //14f 4号;12f 小4;10.5f 5号;9f 小5;
                String bookMarkKey = bookMarks.get(i);
                if (bookMarkKey.equals("FILE_NUMBER")) {//文件编号
                    Dispatch items = Dispatch.call(book_marks, "Item", bookMarkKey).toDispatch();
                    Dispatch range = Dispatch.get(items, "Range").toDispatch();
                    String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", "");
                    Dispatch.put(range, "Text", new Variant("WJBH000007"));//替换文字
                    Dispatch font = Dispatch.get(range, "Font").toDispatch();
                    Dispatch.put(font, "Name", new Variant("Times New Roman"));//设置字体,只能设置系统中存在的字体
                    Dispatch.put(font, "Size", 12f);//设置字体大小
                }
                if (bookMarkKey.equals("GMP_NAME")) {//英文名称
                    Dispatch items = Dispatch.call(book_marks, "Item", bookMarkKey).toDispatch();
                    Dispatch range = Dispatch.get(items, "Range").toDispatch();
                    String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", "");
                    Dispatch.put(range, "Text", new Variant("THIS IS EG NAME"));//替换文字
                    Dispatch font = Dispatch.get(range, "Font").toDispatch();
                    Dispatch.put(font, "Name", new Variant("Times New Roman"));//设置字体,只能设置系统中存在的字体
                    Dispatch.put(font, "Size", 10.5f);//设置字体大小
                }
                if (bookMarkKey.equals("BTYW")) {//中文名称
                    Dispatch items = Dispatch.call(book_marks, "Item", bookMarkKey).toDispatch();
                    Dispatch range = Dispatch.get(items, "Range").toDispatch();
                    String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", "");
                    Dispatch.put(range, "Text", new Variant("这是中文名称1111"));//替换文字
                    Dispatch font = Dispatch.get(range, "Font").toDispatch();
                    Dispatch.put(font, "Name", new Variant("黑体"));//设置字体,只能设置系统中存在的字体
                    Dispatch.put(font, "Size", 12f);//设置字体大小
                }
                if (bookMarkKey.equals("PRINT_NUMBER")) {//流水号
                    Dispatch items = Dispatch.call(book_marks, "Item", bookMarkKey).toDispatch();
                    Dispatch range = Dispatch.get(items, "Range").toDispatch();
                    String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", "");
                    Dispatch.put(range, "Text", new Variant("P00000000001"));//替换文字
                }
                // 替换书签图片。
                // 因为此书签图片在页眉中,页眉中直接将书签替换为图片会出错,所有先将书签替换为空字符串,然后再替换为图片
                if (bookMarkKey.equals("gao")) {//书签图片
                    //替换图片
                    String img_path = "D:\\_tmp\\_printlog\\aa.png";//图片所在路径
                    Dispatch items = Dispatch.call(book_marks, "Item", bookMarkKey).toDispatch();
                    Dispatch range = Dispatch.get(items, "Range").toDispatch();
                    String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", "");
                    Dispatch.put(range, "Text", new Variant(""));//替换二维码书签为空
                    //设置图片
                    Dispatch.call(Dispatch.get(range, "InLineShapes").toDispatch(),
                            "AddPicture", img_path);
                }
            }
            // 保存文件//new variant() 参数 0Doc 12、16Docx 17pdf
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{toFileName, new Variant(12)}, new int[1]);
            
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("word写入失败");
        } finally {
            try {
                System.out.println("word写入成功,关闭文档");
                Dispatch.call((Dispatch) doc, "Close", new Variant(false));
            } catch (Exception e2) {
                e2.printStackTrace();
            }
            if (app != null)
                app.invoke("Quit", new Variant[]{});//关闭进程
            //释放资源
            ComThread.Release();
        }
        //执行打印
        doPrintWord(toFileName);
    }


//打印文档
    private static void doPrintWord(String printFile){
        //静默打印,打印文档,打开新保存的文档,然后执行打印
        System.out.println("打开需打印的文档");
        ActiveXComponent printApp = null;
        Dispatch printDoc = null;
        Dispatch printDocs = null;
        try {
            if (printApp == null || printApp.m_pDispatch == 0) {
                printApp = new ActiveXComponent("Word.Application");
                printApp.setProperty("Visible", new Variant(false));//不可见打开word
                printApp.setProperty("DisplayAlerts", new Variant(false));
                printApp.setProperty("AutomationSecurity", new Variant(3)); //禁用宏
            }
            if (printDocs == null) {
                // 获得documents对象
                printDocs = printApp.getProperty("Documents").toDispatch();
            }
            printDoc = Dispatch.invoke(printDocs, "Open", Dispatch.Method, new Object[]{printFile, new Variant(false), new Variant(true)}, new int[1])
                    .toDispatch();
            System.out.println("打开打印的文档..." + printFile);
            String printSerName = "HP LaserJet Professional M1136 MFP";//打印机名称
            printApp.setProperty("ActivePrinter", new Variant(printSerName));
            //打印
            Dispatch.call(printDoc, "PrintOut", new Variant(false), new Variant());
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("word打印失败");
        } finally {
            try {
                System.out.println("word打印成功,关闭文档");
                Dispatch.call((Dispatch) printDoc, "Close", new Variant(false));
            } catch (Exception e2) {
                e2.printStackTrace();
            }
            if (printApp != null)
                printApp.invoke("Quit", new Variant[]{});//关闭进程
            //释放资源
            ComThread.Release();
        }
    }

3、实现效果

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值