由于项目需要,需要在后台对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、实现效果