最近同事提出问题,在我来此公司之前,他们为客户做过一个打印管理系统,业务是这样的,需要打印的人员,需要先将打印的内容上传到服务器上,然后进行打印的申请,然后领导审批完成,可以进行打印,打印需要到专门的打印控制台,进行刷卡身份认证,然后就能看到被批复的那条可以打印的信息,以及需要被打印的文件,这个文件支持三种类型,word,excel,pdf。之前他们实现的时候,将word,excel全都转换成了pdf,然后统一使用pdf的静默打印,进行打印工作处理。然后如果待打印的文件不算小,那么转换成pdf这一过程是个不小的开销,果然,一天,同事来说,客户打印一个48页的word文档,后台转换程序死在那了。。。。。我问了她一下,为什么不直接打印,为什么要转换成pdf呢(之前的系统是C#的代码,其实可以直接操作word API进行打印控制)她说,之前也是直接打印,但是客户的一个word文档,内容有超出页边距的,打印的过程中,会弹出提示,问:页面超出页边距,是否要继续打印。这样的提示,无法去掉,需要人工进行干预才可以。 我这才明白原来是这样,其实也就是以前的开发人员,没有找到去掉word打印提示框的办法。或者说,并没有仔细的去研究。而放弃了,选择了一个不太明智的办法,转换成pdf。 我先是百度了一下,果然一百度就找到了相对应的帖子,按照帖子的说法,主要在于word的application对象的DisplayAlerts属性。这个属性为false就不会有弹出的任何提示,警告框,嗯,看这个属性的字面意思也是这个作用,于是,编写测试代码,验证一下,我对C#环境不熟悉,于是直接文本写VBS,其实一样的,只要VBS能干的事情,C#也好,C++也好,都能干,都是调的COM组件而已,下面是测试代码:

 
  
  1. printWord()  
  2.  
  3. Private sub printWord()   
  4.  
  5.     Set wordObject = CreateObject("Word.Application")  
  6.     wordObject.Visible = False 
  7.  
  8.     Set wordDocument = wordObject.Documents.Open("E:\超出打印区域.doc")  
  9.     wordObject.WordBasic.FilePrintSetup "778", 0  
  10.  
  11.     wordObject.DisplayAlerts = False 
  12.       
  13.     wordObject.PrintOut()  
  14.  
  15.     wordObject.DisplayAlerts = True   
  16.     wordDocument.close  
  17.     set wordDocument = Nothing 
  18.       
  19.     wordObject.Visible = True 
  20.     wordObject.Quit  
  21.     set wordObject = Nothing 
  22.  
  23. end Sub 

将上面代码保存成后缀.vbs的文件,直接双击运行,得到以下效果:

很明显,wordObject.DisplayAlerts = False 没有达到预期效果。仔细查看msdn,找到下面这个链接:http://support.microsoft.com/kb/163574/zh-cn 上面写的很清楚,最重点的一句话:要防止出现边距错误,您必须禁用后台打印之前发出的命令,可在打印文档。要打印的命令完成后,您可以重新启用后台打印。增加禁用后台打印的代码:

 
  
  1. printWord()  
  2.  
  3. Private sub printWord()   
  4.  
  5.     Set wordObject = CreateObject("Word.Application")  
  6.     wordObject.Visible = False 
  7.  
  8.     Set wordDocument = wordObject.Documents.Open("E:\超出打印区域.doc")  
  9.     wordObject.WordBasic.FilePrintSetup "778", 0  
  10.  
  11.     wordObject.Options.PrintBackground = False 
  12.     wordObject.DisplayAlerts = False 
  13.       
  14.     wordObject.PrintOut()  
  15.  
  16.     wordObject.DisplayAlerts = True   
  17.     wordObject.Options.PrintBackground = True 
  18.  
  19.     wordDocument.close  
  20.     set wordDocument = Nothing 
  21.       
  22.     wordObject.Visible = True 
  23.     wordObject.Quit  
  24.     set wordObject = Nothing 
  25.  
  26. end Sub 

重点就是wordObject.Options.PrintBackground = False,也就是说只有在这句代码生效之后,wordObject.DisplayAlerts = False的作用才会对‘要防止出现边距错误’这个提示起作用。