我想给出一个完整的答案。之前发布的答案有一些解决方案,但它们没有完整地说明我们必须做的所有事情,以通过传真线路成功发送 pdf 文件,在我们的自定义 Windows 服务中使用 FAXCOMEXLib。
我想首先说 FAXCOMEXLib 是为 Windows 控制台应用程序制作的,而不是 Windows 服务。您甚至可以在文档中阅读此内容。我认为这就是为什么我们很难让它发挥作用。
然而,经过多次试验和错误,我们能够(最终)让它工作。我们遇到的大多数问题都与 Adobe Reader 中的设置和权限有关。我们发现,在处理 PDf 文件时,Adobe Reader 试图在幕后做很多事情。它试图做的那些“事情”需要用户交互(点击离开警报框等)。在 Windows 服务下运行它时,该服务没有用户交互,这导致我们的进程无限期挂起并最终出错。但是,我们发现有办法解决所有这些问题。以下是我们的做法:
这是我们正在使用的有效代码片段:
fileName = @"D:\temp\FaxTest.pdf";
faxDoc.Sender.Name = faxRec.From;
faxDoc.Sender.Company = faxRec.From;
faxDoc.Body = fileName;
faxDoc.Subject = faxRec.ReferenceId;
faxDoc.DocumentName = faxRec.ReferenceId;
var to = "xxxxxxxxxx";
faxDoc.Recipients.Add(to, "Some Name");
var serverName = Environment.MachineName;
var myProcesses = Process.GetProcessesByName("AcroRd32");
foreach (var myProcess in myProcesses)
{
if (DateTime.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks) {
myProcess.Kill();
}
}
string[] returnVal = faxDoc.Submit(serverName);
当然,我们的服务中还有比这更多的代码。其他代码执行诸如处理回调事件处理程序以跟踪发送/完成/失败传真的状态等。但这是实际启动“发送”的代码的“心脏”。
这是我们对服务器所做的配置更改列表,以使我们的自定义 Windows 服务正确解码、呈现和发送 pdf 文件作为传真。其中一些列在一些答案中,但有些没有,我希望这是一个完整的答案。
- 以管理员身份登录到服务器并在服务器上安装传真服务器角色。
- 确保传真调制解调器设备/卡已正确安装在服务器上,并且传真线路处于活动状态。您可能只是尝试直接从 Windows 传真实用程序发送几个带有文本文件的测试传真。(在我们的例子中,我们遇到了问题,因为我们必须拨“9”和一个秘密密码才能获得外部的长途线路)。
- 在服务器上安装 Adobe Reader。
- 在服务器上为您的 Windows 服务创建一个用户以“作为”运行。我们称我们的用户为“FaxServiceUser”。
- 至少以该 FaxServiceUser 身份登录到服务器一次。登录后,将“Adobe PDF”设备设置为默认打印机。
- 同样以该用户身份登录时,使用 Adobe 打开 PDF 文件并单击 EULA。
- 以该用户身份登录并打开 Adobe Reader 时,更改以下设置:
- 如果选中,请取消选中“启动阅读器时显示消息”(在“常规”下)
- 取消选中“启动时启用保护模式”复选框(这可能仅适用于 Acrobat 10。在 Acrobat 11 中,此选项已移至安全(增强)并标题为启动时启用保护模式。只需确保您取消 -选中此选项)
- 取消选中“启用增强的安全性”(在“安全性(增强)”下 - 这可能仅适用于 Acrobat 11 及更高版本)
- 选择更新程序选项并禁用自动下载和安装更新。
- 取消选中“从 URL 创建链接”(在“常规”下)
- 取消选中“使手工具阅读文章”(在“常规”下)
- 取消选中“启动阅读器时显示消息”(在“常规”下)
- 取消选中“自动计算字段值”(在“表单”下)
- 取消选中“显示焦点矩形”(在“表单”下)
- 取消选中“显示文本字段溢出指示器”(在“表单”下)
- 取消选中“启用 Acrobat JavaScript”(在“Javascript”下)
- 取消选中“显示欢迎对话框”(在“审查”下)
- 取消选中“打开文件时显示服务器连接警告对话框”(在“查看”下)
- 如果需要,请参阅此链接以获取有关 Adobe Reader 设置的帮助:http: //kb.faxback.com/How+To+Configure+Adobe+XI+for+Use+with+NET+SatisFAXtion
- 在构建、部署和安装您的 Windows 服务之后,更改您的服务的属性以“作为”您之前创建的用户(在我们的例子中为“FaxServiceUser”)运行。
- 将该 FaxServiceUser 的权限添加到它需要读取/写入/删除的任何文件夹。
- 由于 Adobe 旨在作为桌面应用程序运行,因此在您的服务中添加一些代码以释放 Adobe Reader 使用的内存(您可以
myProcess.Kill()
在示例代码的函数中看到我们是如何做到这一点的)。
那应该这样做。这有点麻烦,但我希望这提供了一个完整的示例,说明如何将 Adobe Reader 与您的自定义 Windows 服务一起设置,以从 Windows 服务器上的 pdf 文件发送传真。我们已经做了几个月了,没有任何问题。我们的客户处理的传真量很少,所以我无法说明它是如何处理大量传真的。因此,如果您正在寻找一种“免费”的方式来发送传真,而无需支付 Interfax 之类的费用,这可能是一个可行的选择,至少对于低容量而言是这样。