使用jacob在Word中添加水印

pandge 2009-02-11 05:07:18
最近由于工作的原因需要对Word进行操作,并且在文档上面加上水印,这个问题我在网上搜索了很久都没有一个完整的解决办法,没得办法之好自己研究了,半天的努力没有白费,终于解决了,有兴趣的朋友可以参考下:
环境:
jdk1.4
jacob 1.9

office2003
至于jacob的设置我就不用多说了,网上很多这样的文章,下面就把我的代码贴出来,供大家参考。

package src;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.jacob.com.ComThread;


public class WordObj
{

public WordObj()
{
}

private static WordObj instance;

private Dispatch doc = null;

private Dispatch activeWindow = null;

private Dispatch docSelection = null;

private Dispatch wrdDocs = null;

private String fileName;

private ActiveXComponent wrdCom;

/**
* 获取Word操作静态实例对象
*
* @return 报表汇总业务操作
*/
public final static synchronized WordObj getInstance()
{
if (instance == null)
instance = new WordObj();
return instance;

}

/**
* 初始化Word对象
*
* @return 是否初始化成功
*/
public boolean initWordObj()
{
boolean retFlag = false;
ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法
wrdCom = new ActiveXComponent("Word.Application");
try
{
// 返回wrdCom.Documents的Dispatch
wrdDocs = wrdCom.getProperty("Documents").toDispatch();
wrdCom.setProperty("Visible", new Variant(true));

retFlag = true;
}
catch (Exception e)
{
retFlag = false;
e.printStackTrace();
}
return retFlag;
}

/**
* 创建一个新的word文档
*
*/

public void createNewDocument()
{
doc = Dispatch.call(wrdDocs, "Add").toDispatch();
docSelection = Dispatch.get(wrdCom, "Selection").toDispatch();

}

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

}

/**
* 打开一个已存在的文档
*
* @param docPath
*/

public void openDocument(String docPath)
{
if (this.doc != null)
{
this.closeDocument();
}
doc = Dispatch.call(wrdDocs, "Open", docPath).toDispatch();
docSelection = Dispatch.get(wrdCom, "Selection").toDispatch();
}

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

/**
* 文档设置水印
*
* @param waterMarkStr 水印字符串
*/
public void setWaterMark(String waterMarkStr)
{
// 取得活动窗格对象
Dispatch activePan = Dispatch.get(activeWindow, "ActivePane")
.toDispatch();
// 取得视窗对象
Dispatch view = Dispatch.get(activePan, "View").toDispatch();
//输入页眉内容
Dispatch.put(view, "SeekView", new Variant(9));
Dispatch headfooter = Dispatch.get(docSelection, "HeaderFooter")
.toDispatch();
//取得图形对象
Dispatch shapes = Dispatch.get(headfooter, "Shapes").toDispatch();
//给文档全部加上水印
Dispatch selection = Dispatch.call(shapes, "AddTextEffect",
new Variant(9), waterMarkStr, "宋体", new Variant(1),
new Variant(false), new Variant(false), new Variant(0),
new Variant(0)).toDispatch();
Dispatch.call(selection, "Select");
//设置水印参数
Dispatch shapeRange = Dispatch.get(docSelection, "ShapeRange")
.toDispatch();
Dispatch.put(shapeRange, "Name", "PowerPlusWaterMarkObject1");
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.5));
Dispatch foreColor = Dispatch.get(fill, "ForeColor").toDispatch();
//设置水印颜色
Dispatch.put(foreColor, "RGB", new Variant(16711680));
Dispatch.call(fill, "Solid");
//设置水印旋转
Dispatch.put(shapeRange, "Rotation", new Variant(315));
Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true));
Dispatch.put(shapeRange, "Height", new Variant(117.0709));
Dispatch.put(shapeRange, "Width", new Variant(468.2835));
Dispatch.put(shapeRange, "Left", new Variant(-999995));
Dispatch.put(shapeRange, "Top", new Variant(-999995));
Dispatch wrapFormat = Dispatch.get(shapeRange, "WrapFormat").toDispatch();
//是否允许交叠
Dispatch.put(wrapFormat, "AllowOverlap", new Variant(true));
Dispatch.put(wrapFormat, "Side", new Variant(3));
Dispatch.put(wrapFormat, "Type", new Variant(3));
Dispatch.put(shapeRange, "RelativeHorizontalPosition", new Variant(0));
Dispatch.put(shapeRange, "RelativeVerticalPosition", new Variant(0));
Dispatch.put(view, "SeekView", new Variant(0));
}



/**
* 关闭Word资源
*
*
*/
public void closeWordObj()
{

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

/**
* 得到文件名
*
* @return .
*/
public String getFileName()
{
return fileName;
}

/**
* 设置文件名
*
* @param fileName .
*/
public void setFileName(String fileName)
{
this.fileName = fileName;
}

/**
* 测试功能
*
*/
public static void main(String[] argv)
{
WordObj d = WordObj.getInstance();
try
{
if (d.initWordObj())
{
d.createNewDocument();
d.getActiveWindow();
d.setWaterMark("HEllo");
// d.closeWordObj();
}
else
System.out.println("初始化Word读写对象失败!");
}
catch (Exception e)
{
d.closeWordObj();
}
}
}


这个任务的完成要感谢下面链接提供的帮助:
http://blog.csdn.net/yangyinbo/archive/2008/11/25/3373576.aspx
http://www.bzwb.net/jishu4.asp
http://bbs.51js.com/archiver/tid-48399.html
如果有什么不足之处,请大家多提宝贵意见

...全文
1249 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rudy_279150469 2012-10-23
  • 打赏
  • 举报
回复
问下,jacob在unix下dll文件是怎么放的了,哪位大虾指点下
LogicTeamLeader 2012-09-19
  • 打赏
  • 举报
回复
这么老的坑???
ansonwang_hf 2012-09-19
  • 打赏
  • 举报
回复
相见恨晚
JAVA蚁族 2012-08-01
  • 打赏
  • 举报
回复
不错,收藏
zqfddqr 2012-07-27
  • 打赏
  • 举报
回复
恩 不错不错
zn353010922 2012-07-27
  • 打赏
  • 举报
回复
这个好像存在点问题吧?现象是:当word程序开着(也就是你打开着任意word文档),运行程序时会提示,文件被锁之类的问题。这个是单例模式造成的还是本身就存在这样的问题?
javaoaout 2009-03-16
  • 打赏
  • 举报
回复
mark
dawn023 2009-03-14
  • 打赏
  • 举报
回复
mark
loveunittesting 2009-03-14
  • 打赏
  • 举报
回复
哈哈,有时候也会用jacob,谢谢了,收藏。
daf640101297 2009-03-10
  • 打赏
  • 举报
回复
请问楼主我怎么用jacob创建一个文本框呢?很想知道,如果你知道的话请发我的邮箱吧,谢谢



我的邮箱:dave640101297@126.com

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧