小弟由于项目需要,需要利用将Office的文档生成pdf,现如今把程序搭建到客户的服务器上时发现一个诡异的问题,总是提示文档生成失败,找了各方面的资料,最终把问题定位到Office组件的DCOM问题上。
程序设计:
引用Microsoft.Office.Interop.Word,Microsoft.Office.Interop.Excel,Microsoft.Office.Interop.PowerPoint三个组件实现生成pdf的功能。
问题重现:
1、在本地测试生成pdf的功能正常,但是在上传Office文档生成的时候,有时会出现一个进度条,推理应该是生成文档时的Office组件的后台处理动作。
2、在把程序发布到客户服务器上时,问题出现,功能完全瘫痪,并抛出类似如下异常,根据调用组件不同,异常略有不同。
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
网上查了N多资料,设置了N种的Dcom权限,该添加的用户都添加了,启动权限一会是交互式用户,一会是启动用户,还有指定用户均没有完美解决,
其中设置为交互式用户时,虽可以生成pdf,但需要保持对服务器的远程桌面开启,照我的理解是需要有用户登录到服务器方可,这不是我想要的最终解决方案。
期间参考的资料:
http://www.cnblogs.com/petitprince/archive/2010/08/20/1804360.html
http://www.cnblogs.com/yangpu/archive/2010/01/24/1655077.html
其中自己的理解:
Office作为一个带有UI的自动化软件,其中肯定有许多需要用户交互的操作,比如说在打开一个加密的文档的时候需要输入口令,还有文档打开异常时提示继续还是终止这些,所以单纯的利用Office组件和几行代码来转化pdf出发点应该就是不靠谱的。
但客户毕竟上帝,需求毕竟是问题,是问题就得想破脑子解决,故希望各位大牛能给小弟指明一个方向,无论是在上面提到的基础上修改完善,还是另辟蹊径。我的问题只有一个把Office文档生成破地方,仅此而已!
另外说明一下,我最近也尝试了利用Open Office来生成pdf,但是效果不理想,在页面显示上会有差异,比方说提前换行了,换页符不顶用,空白页没有了,还有还会出现字体重叠的现象,我已基本放弃了此种方案。
用NPOI解析文档,用itext生成PDF,这个能通吃,不过实现起来有些烦。
用FlashPaper2.2吧!可以把word、excel等转换为flash、pdf等