jacob.jar 操作word文件 添加水印、图片(附查阅Microsoft Office VBA参考文档方式)

jacob.jar 操作word文件 添加水印、图片

1.准备jacob.jar包和dll文件

将jacob.jar引入到工程,

64位: 将jacob-1.17-M2-x64.dll 放在C:\Windows\System32下

32位:将jacob-1.17-M2-x86.dll 放在C:\Windows\SysWOW64下

若上述位置不生效,可尝试放在jdk安装位置:

将jacob-1.17-M2-x64.dll放在C:\Program Files\Java\jdk1.7.0_25\jre\bin下,将jacob.jar放在C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext下

2.编写工具类
import java.io.File;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public final class WaterMarkUtilOffice {

    public WaterMarkUtilOffice() {}
    private static WaterMarkUtilOffice instance;
    private Dispatch aDoc = null;//用于存储一个文档:比如新增一个文档时返回,新增的文档
    private Dispatch activeWindow = null;//当前活动窗口
    private Dispatch docSelection = null;//存储当前被选中文档
    private Dispatch wordDocs = null;//存储所有的文档
    private String fileName;
    private ActiveXComponent wordApp;//Word对象
    public final static synchronized WaterMarkUtilOffice getInstance() {
        if (instance == null){
            instance = new WaterMarkUtilOffice();
        }
        return instance;
    }

    /*** 初始化Word对象*/
    public boolean initWordApp() {
        boolean retFlag = false;
        //初始化com线程【相当于打开冰箱门,准备放大箱】
        //使用结束后要调用 realease方法关闭线程【相当于关上冰箱门】
        ComThread.InitSTA();
        wordApp = new ActiveXComponent("Word.Application");// 初始化word应用程序,初始化表格是:Excel.Application
        try {
            wordApp.setProperty("Visible", new Variant(false));//配置启动word时是显示执行还是隐式执行
            wordDocs = wordApp.getProperty("Documents").toDispatch();// 获取word所有文档对象
            retFlag = true;
        } catch (Exception e) {
            retFlag = false;
            e.printStackTrace();
        }
        return retFlag;
    }


    /**打开一个已存在的文档*/
    public void openDocument(String docPath) {
        if (this.aDoc != null) {
            this.closeDocument();
        }
        aDoc = Dispatch.call(wordDocs,"Open",new Variant(docPath)).toDispatch();//docPath要打开的文档的详细地址
        docSelection = Dispatch.get(wordApp, "Selection").toDispatch();//获得该文档对象,并返回
    }


    /** 取得活动窗体对象*/
    public void getActiveWindow() {
        activeWindow = wordApp.getProperty("ActiveWindow").toDispatch();// 取得活动窗体对象
    }


    /***创建一个新的word文档*/
    public void createNewDocument() {
        aDoc = Dispatch.call(wordDocs, "Add").toDispatch();//创建一个新的word文档,并返回
        docSelection = Dispatch.get(wordApp, "Selection").toDispatch();//获得该文档对象,并返回
    }


    /*** 保存并关闭当前word文档*/
    public void closeDocument() {
        if (aDoc != null) {
            Dispatch.call(aDoc, "Save");//保存
            Dispatch.call(aDoc, "Close", new Variant(0));//关闭
            aDoc = null;
        }
    }


    /*** 关闭Word资源*/
    public void closeWordObj() {
        wordApp.invoke("Quit", new Variant[] {});// 关闭word文件
        ComThread.Release();// 释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
    }


    /**
     * 插入图片
     * @param pages 总页数
     * @param imgPath 图片路径
     * @param left 距离左上角位置
     * @param top 距离上角位置
     */
    public void setImages(String imgPath,int left,int top){
    	Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch();
   	
        
        Dispatch inLineShapes = Dispatch.get(selection, "InLineShapes").toDispatch();
        Dispatch picture = Dispatch.call(inLineShapes, "AddPicture", imgPath).toDispatch();
        //选中图片
        Dispatch.call(picture, "Select");
        //设置宽度高度
        // Dispatch.put(picture, "Width", new Variant(100));
        //Dispatch.put(picture, "Height", new Variant(100));
        
        //设置环绕方式
        Dispatch ShapeRange = Dispatch.call(picture, "ConvertToShape").toDispatch(); // 取得图片区域
        Dispatch WrapFormat = Dispatch.get(ShapeRange, "WrapFormat").toDispatch(); // 取得图片的格式对象
        Dispatch.put(WrapFormat, "Type", 5); // 设置环绕格式(0 - 7)下面是参数说明
        // wdWrapInline 7 将形状嵌入到文字中。 
        // wdWrapNone 3 将形状放在文字前面。请参阅 wdWrapFront 。
        // wdWrapSquare 0 使文字环绕形状。行在形状的另一侧延续。
        // wdWrapThrough 2 使文字环绕形状。
        // wdWrapTight 1 使文字紧密地环绕形状。
        // wdWrapTopBottom 4 将文字放在形状的上方和下方。
        // wdWrapBehind 5 将形状放在文字后面。
        // wdWrapFront 6 将形状放在文字前面。         
        //设置图片相对左上角偏移位置
//        xuhao
//        selection = Dispatch.get(wordApp, "Selection").toDispatch();
        Dispatch shapeRange = Dispatch.get(selection, "ShapeRange").toDispatch();
        Dispatch.put(shapeRange, "Left", new Variant(left));
        Dispatch.put(shapeRange, "Top", new Variant(top));
        //翻到下一页
        //Dispatch browser = Dispatch.get(wordApp, "Browser").toDispatch();
        //Dispatch.call(browser, "Next");
    }


    /**
     * 设置页眉
     * @param headerStr
     */
    public void setHeader(String headerStr) {
        Dispatch activePane = Dispatch.get(activeWindow, "ActivePane").toDispatch();// 活动窗格
        Dispatch view = Dispatch.get(activePane, "View").toDispatch();// 视窗对象

        Dispatch.put(view, "SeekView", new Variant(9));// 打开页眉,值为9,页脚值为10
        Dispatch headerfooter = Dispatch.get(docSelection, "HeaderFooter").toDispatch();// 获取页眉和页脚

        Dispatch range = Dispatch.get(headerfooter, "Range").toDispatch();//页眉赋值
        Dispatch.put(range, "Text", new Variant(headerStr));

        Dispatch font = Dispatch.get(range, "Font").toDispatch();//设置字体
        Dispatch.put(font, "Name", new Variant("微软雅黑"));
        Dispatch.put(font, "Bold", new Variant(true));
        Dispatch.put(font, "Size", 20);
        Dispatch.put(font, "Color", Integer.valueOf("0000FF",16).toString());//颜色是16进制倒着写,然后转10进制

        Dispatch.put(view, "SeekView", new Variant(0)); //0表示恢复视图;
    }

    /** 文档设置图片水印,waterPic水印图片路径*/
    public void setWaterPic(String waterPic) {
        Dispatch activePane = Dispatch.get(activeWindow, "ActivePane").toDispatch();// 活动窗格
        Dispatch view = Dispatch.get(activePane, "View").toDispatch();// 视窗对象

        //Dispatch.call(docSelection, "InsertBreak");
        Dispatch.put(view, "SeekView", new Variant(9));// 打开页眉,值为9,页脚值为10
        
        //设置首页不同
//    	xuhao start
    	Dispatch section = Dispatch.get(wordApp, "Selection").toDispatch();
    	Dispatch PageSetup = Dispatch.get(section, "PageSetup").toDispatch();
        Dispatch.put(PageSetup, "DifferentFirstPageHeaderFooter", new Variant(true)); //设置首页不同时只有第一页有水印
        //Dispatch.put(PageSetup, "DifferentFirstPageHeaderFooter", new Variant(false)); //不设置首页不同时所有页都有水印
//    	xuhao end
        
        Dispatch headerfooter = Dispatch.get(docSelection, "HeaderFooter").toDispatch();// 获取页眉和页脚

        Dispatch shapes = Dispatch.get(headerfooter, "Shapes").toDispatch();// 获取水印图形对象

        //调用shapes对象的AddPicture方法将图片插入当前文档
        Dispatch picture  = Dispatch.call(shapes,"AddPicture",waterPic).toDispatch();

        Dispatch.call(picture, "Select");//选择当前word文档的图片水印

        Dispatch.put(picture, "Left", new Variant(180));//设置图片水印参数
        Dispatch.put(picture, "Top", new Variant(350));
//        Dispatch.put(picture, "LockAspectRatio", new Boolean(true));//调整大小时保持其长宽比例不变
//        Dispatch.put(picture, "Width", new Variant(120));
//        Dispatch.put(picture, "Height", new Variant(90));

        Dispatch.put(view, "SeekView", new Variant(0));//关闭页眉,0表示恢复视图;
    }

    /** 文档设置文字水印--实质是设置页眉,将文字转为艺术字图片*/
    public void setWaterMark(String waterMarkStr) {
        Dispatch activePane = Dispatch.get(activeWindow, "ActivePane").toDispatch();// 活动窗格
        Dispatch view = Dispatch.get(activePane, "View").toDispatch();// 视窗对象

        Dispatch.put(view, "SeekView", new Variant(9));// 打开页眉,值为9,页脚值为10
        Dispatch headerfooter = Dispatch.get(docSelection, "HeaderFooter").toDispatch();// 获取页眉和页脚

        Dispatch shapes = Dispatch.get(headerfooter, "Shapes").toDispatch();// 获取水印图形对象

        /**插入文字,并转为图片:
         * 操作对象、方法、艺术字格式[0白色、1黑左下右上,2黑中上两下、3黑中小两大、4黑竖排、5黑中下两上]
         * 水印内容、字体、字体大小、字体是否粗体、字体是否斜体
         * 左边距、上边距
         */
        Dispatch selection = Dispatch.call(shapes, "AddTextEffect",new Variant(0),
                waterMarkStr, "微软雅黑", new Variant(10),new Variant(true), new Variant(false),
                new Variant(150),new Variant(250)).toDispatch();

        //选中当前文档水印
        Dispatch.call(selection, "Select");
        Dispatch shapeRange = Dispatch.get(docSelection, "ShapeRange").toDispatch();

        /**
         * 设置水印透明度和颜色
         */
        Dispatch.put(shapeRange, "Name", "PowerPlusWaterMarkObject6");
        Dispatch textEffect = Dispatch.get(shapeRange, "TextEffect").toDispatch();
        Dispatch.put(textEffect, "NormalizedHeight", new Boolean(false));


        Dispatch line = Dispatch.get(shapeRange, "Line").toDispatch();
        Dispatch.put(line, "Visible", new Boolean(false));

        Dispatch fill = Dispatch.get(shapeRange, "Fill").toDispatch();
        Dispatch.put(fill, "Visible", new Boolean(true));
        Dispatch.put(fill, "Transparency", new Variant(0.1));// 设置水印透明度

        Dispatch foreColor = Dispatch.get(fill, "ForeColor").toDispatch();
        Dispatch.put(foreColor, "RGB", new Variant(255));// 设置水印颜色

        Dispatch.call(fill, "Solid");

        /**
         * 设置水印旋转角度、水印大小
         */
        Dispatch.put(shapeRange, "Rotation", new Variant(0));//旋转角度
        Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true));//调整大小时保持其长宽比例不变
        Dispatch.put(shapeRange, "Height", new Variant(10));//高
        Dispatch.put(shapeRange, "Width", new Variant(40));//宽
        Dispatch.put(shapeRange, "Left", new Variant(160));
        Dispatch.put(shapeRange, "Top", new Variant(270));

        Dispatch.put(view, "SeekView", new Variant(0));//0表示恢复视图;
    }


    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    //测试功能
    public static void main(String[] argv) {
        WaterMarkUtilOffice d = WaterMarkUtilOffice.getInstance();
        try {
            if (d.initWordApp()) {
                d.openDocument("C:"+ File.separator+"111.docx");
                d.getActiveWindow();

                String imgPath="d:"+ File.separator+"11.png";
                 d.setWaterPic(imgPath);//页中图片
                //d.setImages(imgPath,10,650);
                //d.setImages(imgPath,350,650);
                d.closeDocument();

            } else{
                System.out.println("初始化Word读写对象失败!");
            }
        } catch (Exception e) {
            System.out.println(e);
        }finally{
            d.closeWordObj();
        }
    }
}
3.若想实现其它功能,如何查找资料

jacob操作文档 可查阅Microsoft Office VBA参考文档(https://docs.microsoft.com/zh-cn/office/vba/api/overview/),对文档的操作其实就是通过属性方法的操作实现对对象模型的修改。
在这里插入图片描述

以设置页眉首页不同为例,先查阅文档,确定需要操作的对象及属性,然后通过以下代码获取对象,为属性设值

Dispatch section = Dispatch.get(wordApp, "Selection").toDispatch();
Dispatch PageSetup = Dispatch.get(section, "PageSetup").toDispatch();
Dispatch.put(PageSetup, "DifferentFirstPageHeaderFooter", new Variant(true));

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jacob.jar 是一款功能强大的Java图形用户界面(GUI)库,它可以帮助开发者快速构建用户友好的桌面应用程序。 Jacob.jar 提供了丰富的GUI组件,包括按钮、文本框、标签、复选框、下拉框等,这些组件可以方便地用于创建交互式界面。此外,Jacob.jar 还支持布局管理器,使界面可以灵活地适应不同尺寸的屏幕。 使用 Jacob.jar 开发应用程序非常简单。首先,我们需要在Java项目中导入Jacob.jar库。然后,可以创建窗口对象并设置窗口的属性,如窗口标题、大小等。接下来,我们可以添加所需的组件到窗口上,并设置它们的位置和样式。最后,我们可以为组件添加事件处理程序,以便用户与应用程序进行交互。 Jacob.jar 还提供了一些扩展功能,如绘图和动画效果。开发者可以使用绘图API绘制各种图形和图像,从而使应用程序更具吸引力。同时,通过使用动画效果,我们可以为用户提供更流畅的界面体验。 Jacob.jar 还有一个强大的文档支持,其中包含了详细的教程和示例代码,可以帮助开发者快速学习和掌握该库的使用方法。 综上所述,Jacob.jar 是一款功能丰富的Java GUI库,它可以简化桌面应用程序的开发过程,并提供了丰富的组件和扩展功能,使应用程序更加用户友好和吸引人。使用 Jacob.jar 可以帮助开发者节省大量的开发时间和精力,使得开发高质量的桌面应用程序变得更加容易。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值