,
记录并整理自己网上查阅的资料,网上的代码感觉始终有点不全,一些操作没有完全关闭,比如打开的Word没有关闭,一直占用这系统资源;由于网上很多实例都是讲解打印Excel文档的,微软的MSDN上面的具体的ActiveX部件对象的属性、事件、方法等也是以Excel为例的(https://msdn.microsoft.com/zh-cn/VBA/Excel-VBA/articles/sheets-printout-method-excel)
而我这里打印的文件是Word文档,所以在设置打印参数的时候发现没有打印份数这个参数(也可能是我没有深究到),还没有具体的打印完成状态返回,直接发送打印指令过去就完了。
具体操作如下:
- 首先将JACOB的DLL拷贝至 C:\Windows\System32 中,然后引入jar包(jacob.jar)到项目中
- DCom Server Process Launcher(DcomLaunch)服务需要打开[services.msc]
- 需要安装Microsoft office 2003+
具体的实现代码:
/**
* @param path 文档路径
* @param copies 打印份数(word的打印这个参数无法设置)
*/
public static void printWord(String path,int copies){
if(path.isEmpty()||copies<1){
System.out.println("无文档文件");
return;
}
System.out.println("开始打印");
ComThread.InitSTA();
ActiveXComponent word=new ActiveXComponent("Word.Application");//创建 ActiveX部件对象,这里是Word的
Dispatch doc=null;
Dispatch.put(word, "Visible", new Variant(false)); Visible是控制文档打开后是可见还是不可见,false:静默打印(不可见)
Dispatch docs=word.getProperty("Documents").toDispatch();
doc=Dispatch.call(docs, "Open", path).toDispatch();
try {
Dispatch.call(doc, "PrintOut");//打印
System.out.println("完成打印");
} catch (Exception e) {
e.printStackTrace();
System.out.println("打印失败");
}finally{
try {
if(doc!=null){
Dispatch.call(doc, "Close",new Variant(true));//word文档关闭
}
} catch (Exception e2) {
e2.printStackTrace();
}
//退出
word.invoke("Quit", new Variant[0]);
//释放资源
ComThread.Release();
ComThread.quitMainSTA();
}
}
一个基本的打印就完成了,直接调用这个方法即可打印Word文档。
附(jar包和dll文件下载,由于csdn已经不能设置免费下载了,所以我就设了最少的一个2积分):http://download.csdn.net/download/qq_26891233/10234805