服务器直接打印excel文件功能
最近在做一个aspnet 调用服务器打印机直接打印excel功能。
实现方式是两种:
-
直接调用自己程序里的打印功能将excel 发送给打印机。
通过调用cmd程序,cmd程序直接将文件发送给打印机
-
调用office com 组件excel将文件发送到打印机。
通过调用cmd程序,cmd程序调用excel组件打印。
第一种方式遇到的问题:
-
打印机设置了自定义纸张,本地测试打印无误,服务器打印则出现纸张错位情况(本该打印在一张纸上,却分了两张纸打印,及自定义纸张没发挥作用。)经过分析是由于设置打印机自定义纸张的登录用户为administrator,实则打印的用户为NETWORK_SERVICE 及IIS 用户,
无法用iis虚拟用户设置打印机纸张。
解决方法:①将要调用的cmd 程序右键设置为 以管理员身份运行,如下图:
②将IIS上部署网站 应用程序池里面标识用户设置为administrator,如下图:
这样使得此网站已administrator的权限去调用,调用时任务管理器里面此进程w3wp.exe是以administrator运行的:
经过这两步设置,打印趋于正常。
但是多用户打印测试之后,还会有打印机纸张错位及程序挂死无反应情况。后改成多线程,将挂死进程杀掉重新打印也正常,但是不稳定,还是会出现打印错位情况。所以尝试第二种打印方式。
第二种方式遇到的问题:
-
本地调试打印没问题, 发布网站放到IIS 上之后,调用打印没法应。
解决方法:根据第一种方式得到启示,应该也是IIS调用 office 组件权限问题。所以去google,
查到了 http://www.cnblogs.com/zhongxinWang/p/3275154.html,根据里面的设置最后还是打印没反应,又去google查
asp操作excel权限不足 的问题,查到很多关于这类的问题,内容大同小异:
http://www.cnblogs.com/hyqiang168/articles/989221.html:
解决方法:
在DCOM组件服务中给MICROSOFT.EXCEL组件赋予ASP.NET的操作权限,具体步骤:
(1)打开开始菜单的运行对话框,输入dcomcnfg命令,确定,这时会弹出组件服务窗口
(2)展开计算机-〉我的电脑-〉DCOM配置,找到Microsoft Excel应用程序节点,单击右键-〉属性
(3)点击"标识"标签,选择"交互式用户"
(4)选中"安全"选项,在下面三个项目都选择"自定义",并单击编辑按钮
(5)在启动权限对话框中点击添加按钮,添加相应的用户(注意:如果是WIN2000,XP,则添加"ASPNET"用户,如果是WIN2003,则添加"NETWORK Service"用户),并赋予本地的所有权限 ,访问权限和配置权限和前面一样添加ASPNET用户。
PS:
64位系统:ctrl+R 运行 comexp.msc -32
32位系统: ctrl+R 运行 dcomcnfg.exe
经过比较,以上两个网址里面只有标识选项卡 设置不同。如下图:
最终改为交互式用户再进行打印,调用成功。
感想:首先遇到问题,要根据问题的现象,症状分析问题的根源,判断问题的方向很重要,只有对症下药才能解决问题。
一方面是技术,一方面是解决问题的思路能力。找到问题的根源,方向很重要。
自己遇到问题时,几乎都是本地调试打印没问题,发布到IIS上之后调用不成功,说明不是代码的原因,那就要比较本地和发布之后有什么不同了,很容易想到的是权限问题,本身NETWORK_SERVICE 用户权限
引用下面两句话:
Network Service账户只拥有本机部分权限,它能够以计算机的名义访问网络资源,还有认证用户有权限访问的资源。
在服务器上操作excel要调用com组件,因此对network service的授权需要配置excel应用程序com组件。
所以要解决的就是两个权限问题:
-
调用打印机自定义纸张的权限
-
操作excel 调用com组件问题
当然也是查了各位的博客,3Q So Much。
以下博客地址作引用参考:
http://www.cnblogs.com/zhongxinWang/p/3275154.html
http://www.cnblogs.com/hyqiang168/articles/989221.html
http://blog.csdn.net/happy_ddm/archive/2007/07/09/1683207.aspx
http://wenku.baidu.com/view/59db50808762caaedd33d45f.html
http://blog.csdn.net/yangtze_nancy/article/details/5933634
http://edu.cnzz.cn/201307/91403b90.shtml
遗留问题:
本地win7 打印没问题,但是放到server2008 上之后单线程打印没问题,多线程则出现调用exe成功,但是没打印。