这个方法不能说是真正意义上的添加水印,因为真正添加水印的方法很全面。他可以将字转为水印,或者将图片变成半透明,放入word中。
而我这个方法只是在插入图片的基础上,做了一点点改进,可以设置图片的位置,而不是用字符串写在固定的位置,用图片替换。这样的坏处有两点,一是他只能固定位置不动,二是他永远不能覆盖与你的文本之上。类似人为的盖章。他做不到。ok you know!
插入的水印图片的话,让你的美工把图片背景做成透明的就好啦。
下面请看代码。
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* 给word中添加水印。
* @author root
*
*/
public class InsertImg{
private Dispatch activeWindow = null;
public static void main(String []args) {
InsertImg Watermarking = new InsertImg();
Watermarking.insertPicByjacob("F:\\请示文件.doc","f:\\新请示文件.doc","picture","f:\\yinzhang.png");
}
/**
* 无需关注
* @param bookmarkName
* @param imagePath
* @param width
* @param height
*/
public void insertImageAtBookmark(String bookmarkName, String imagePath, int width, int height){
//Dispatch dispatch = getBookmark(bookmarkName);
Dispatch dispatch = Dispatch.get(this.activeWindow, "ActivePane").toDispatch();
if(dispatch != null){
Dispatch picture = Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();
Dispatch.call(picture, "Select");
Dispatch.put(picture, "Width", new Variant(width));
Dispatch.put(picture, "Height", new Variant(height));
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 将形状放在文字前面。
Dispatch.call(picture, "Select");
Dispatch.put(picture, "Left", new Variant(550));
Dispatch.put(picture, "Top", new Variant(550));
}
}
/**
* 添加水印代码
* @param templatePath
* @param targetPath
* @param word
* @param imagePath
*/
public void insertPicByjacob(String templatePath, String targetPath, String word, String imagePath) {
System.out.println("启动word...");
ActiveXComponent app = null;
Dispatch doc = null;
// 模板的路径
String openPath = templatePath;
// 要保存的文件的路径
String toFileName = targetPath;
Dispatch docs = null;
if (app == null || app.m_pDispatch == 0) {
app = new ActiveXComponent("Word.Application");
app.setProperty("Visible", new Variant(false));
app.setProperty("DisplayAlerts", new Variant(false));
}
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);
Dispatch selection = app.getProperty("Selection").toDispatch();
Dispatch find = Dispatch.call(selection, "Find").toDispatch();// 获得Find组件
Dispatch.put(find, "Text", word); // 查找字符串
Dispatch.put(find, "MatchWholeWord", "True"); // 全字匹配
boolean bl = Dispatch.call(find, "Execute").getBoolean(); // 执行查询
Dispatch activeDocument = app.getProperty("ActiveDocument")
.toDispatch();
Dispatch bookMarks = app.call(activeDocument, "Bookmarks")
.toDispatch();
boolean bookMarkExist = app.call(bookMarks, "Exists", word)
.toBoolean();
if (bookMarkExist) {
Dispatch picture = Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath).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.put(ShapeRange, "Left", new Variant(360));//图片的左边距
Dispatch.put(ShapeRange, "Top", new Variant(630));//图片的上边距
Dispatch WrapFormat = Dispatch.get(ShapeRange, "WrapFormat").toDispatch(); // 取得图片的格式对象
Dispatch.put(WrapFormat, "Type", 6);
System.out.println(bookMarkExist);
}
// 保存文件
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { targetPath, new Variant(12) }, new int[1]);
Dispatch.call((Dispatch) doc, "Close", new Variant(false));
System.out.println("关闭文档");
if (app != null)
app.invoke("Quit", new Variant[] {});
}
}
同样的,也是使用操作word的jar包,这里多了两个设置就是需要设置图片的上边距,还有左边距。
下面演示一下。
F盘下有一个.doc文档 以及一张背景为透明的印章图片。
看一下main方法中,调用的方法传入参数的含义。
Watermarking.insertPicByjacob("F:\\请示文件.doc","f:\\新请示文件.doc","picture","f:\\yinzhang.png");
//第一个参数是原文件,第二个参数是生成的新文件,第三个参数是加入书签的名字(下图),第四个参数是图片
然后我们运行程序。
显示成功
F盘下也生成了一个新的word文档
打开看一下
内容是网上拷贝的,没价值。图片已经放入到了应该的位置。
// wdWrapInline 7 将形状嵌入到文字中。
// wdWrapNone 3 将形状放在文字前面。请参阅 wdWrapFront 。
// wdWrapSquare 0 使文字环绕形状。行在形状的另一侧延续。
// wdWrapThrough 2 使文字环绕形状。
// wdWrapTight 1 使文字紧密地环绕形状。
// wdWrapTopBottom 4 将文字放在形状的上方和下方。
// wdWrapBehind 5 将形状放在文字后面。
// wdWrapFront 6 将形状放在文字前面。
测试的时候是使用的6,形状放在文字前面。其他都可用。可以亲自试一下。