2020-01-08 工作日记:无题
有个客户有个发文功能, 发文上传的是一个红头 WORD 文件, 需要在线预览, 以前有这个功能, 是使用 aspose.words 组件把 word 另存为了 pdf 文件, 然后再显示给用户在线查看,但是在使用 aspose.words 组件转换为 pdf 的时候有些情况会变形,因为是基本是红头文件,所以对文件的格式要求非常高,不能有任何变形,经测试,变形的文件,在 word 中打开然后另存为 pdf 文件,则不会变形,于是想到了就在服务器上装个 office, 调用 word 本身来转 pdf。
首先是开发了一个控制台应用程序,控制台程序里面调用 word 应用程序来转换,然后在 asp.net 里通过 Process 类来调用此命令行程序,通过传递源文件路径和目标文件路径给控制台程序,经测试,我在 cmd 下面调用此控制台程序来转文件,没有任何问题,但是在 asp.net 里通过 Process 程序来调用,怎么都转换不成功,在进程管理器里可以看到已经打开了 word, 没有任何响应,而且 word 占用内存奇高, 根据日志信息, 发现是对 dcom 没有权限, 根据相关查询,对 Microsoft Office word 组件进行了一些设置,发现还是不行。给 Process 类设置了 windows 的帐号和密码也不行,想在 web.config 里设置帐号, 想想还是算了,这个客户的服务器,不方便添加帐号密码。
于是又想着开发一个 windows services, windows service 一般是使用 local system 帐号来运行,应该有权限吧, 于是把刚才的控制台程序改造了一下, 在内部提供了一个 http server 服务, asp.net 通过 webclient 和控制台程序进行交互,再利用 nssm 工具,把控制台程序转换为了一个 windows services 程序,经测试, 直接运行控制台程序,然后 asp.net 调用,没有问题, 作为一个 windows services 来运行,还是不行,通过一翻查找,发现有这样那样的设置,经过一翻设置后,还是不行。
最终又把程序搞成了一个 winform 程序,内置一个 httpserver 程序,然后在设置自动调动(把快捷方式复制到了启动目录: shell:startup), 程序在判断一下是否有启动过,有启动过就不在启动。自动启动后,asp.net 里再调用,就没有问题了。
程序的核心代码非常简单,也非常快就实现了,但是因为各种原因,最终折腾了一个下午。