如何使用FAXCOMEXLib从Windows服务发送pdf传真?

时间:2017-09-30 20:50:14

标签: c# windows-services fax interfax

我之前看过这个问题,但我没有看到任何明确的答案,绝对没有解决我问题的答案。我创建了一个Windows服务,使用FAXCOMEXLib livrary发送传真(半自动)。到目前为止,我的服务已成功发送文本文件(.txt)。但是当我尝试发送pdf,jpg或tif文件时,我收到“操作失败”错误。在SO中,我已经看到很多关于运行该服务的用户的权限的讨论。我尝试了很多不同的选项(本地服务,本地用户,具有管理员权限的自定义用户,允许服务与桌面交互)。但似乎没有任何区别。似乎该服务没有权限打开相应的应用程序来“打印”pdf,jpg或tif文件。但我只是在猜测。有没有人成功通过FAXCOMEXLib在Windows服务中发送传真?这是我发送传真的代码:

fileName = @"D:\temp\FaxTest.txt"; //THIS WORKS
//fileName = @"D:\temp\FaxTest.pdf"; //Operation failed
//fileName = @"D:\temp\FaxTest.tif"; //Operation failed
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;
string[] returnVal = faxDoc.Submit(serverName);

如果你想知道,是的,那些文件确实存在于服务器上,并且它们是有效的文件(我可以在Adobe Reader和Picture Viewer中打开它们)。如果我在我的开发机器上本地运行它,这也可以正常工作。当然,在发送之前(在我的本地机器上)弹出适当的查看器。我的猜测是,由于某种原因,该服务无法打开查看器。有没有人在Windows服务中以这种方式成功发送PDF?

4 个答案:

答案 0 :(得分:3)

the MSDN article中记录得非常好。需要发生的非常重要的事情是某些软件需要将文件内容转换为可传真的可打印文本。引用:

  

您可以作为传真正文发送的文档示例包括文本文件(.txt),Microsoft Word文档(.doc)或Microsoft Excel电子表格(.xls)。当您从客户端计算机发送传真时,正文必须与该计算机上安装的应用程序相关联,并且该应用程序必须支持PrintTo动词;否则,传真将失败。

因此,您可以执行的一个简单测试是在资源管理器中右键单击该文件,然后查找“打印”命令。然后将文件拖到打印机上以练习PrintTo动词。如果这些测试失败,那么它就无法工作,您需要安装一个知道如何打印文件的应用程序。

从服务中执行此操作会对执行打印的应用程序产生额外要求。其中有很多在服务中表现不佳。特别是当您尝试打印时,Microsoft强烈建议不要在服务中执行此操作。办公室应用程序最近没有,这使得MSDN建议已经很弱了。

在我的机器上,.tif扩展名与UWP应用程序相关联,也不会在服务中运行。鉴于处理这些流行扩展的大量应用程序,最好去superuser.com并命名您喜欢使用的特定扩展程序,Windows版本和应用程序,因此很难提供好的建议。从用户会话中执行此操作肯定是最不麻烦的。

答案 1 :(得分:2)

我想对此给出完整的答案。之前发布的答案有一些解决方案,但他们没有全面了解我们在通过传真线成功发送pdf文件所需的一切,在我们的自定义Windows服务中使用FAXCOMEXLib。

我想通过说FAXCOMEXLib是为Windows控制台应用程序而不是Windows服务而开始。您甚至可以在文档中阅读此内容。而且我认为这就是为什么我们在工作时遇到这么多麻烦。

然而,经过多次试验和错误后,我们能够(终于)开始工作了。我们遇到的大多数问题都与Adobe Reader中的设置和权限有关。我们发现Adobe Reader在处理PDf文件时试图在幕后做很多事情。那些"东西"它试图进行必要的用户交互(点击警告框等)。在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);

当然,我们的服务中有更多的代码。其他代码执行诸如处理回调事件处理程序以跟踪发送/完成/失败传真的状态等事情。但这是" heart"实际启动"发送"。

的代码

以下是我们对服务器进行的配置更改列表,以使我们的自定义Windows服务正确解码,呈现和发送pdf文件作为传真。其中一些列在一些答案中,但有些则没有,我希望这是一个完整的答案。

  1. 以管理员身份登录服务器,并在服务器上安装传真服务器角色。
  2. 确保服务器上的传真调制解调器设备/卡已正确安装,并且传真线路处于活动状态。您可能只是尝试直接从Windows传真实用程序发送带有文本文件的几个测试传真。 (在我们的案例中,我们遇到了问题,因为我们必须拨打" 9"以及一个秘密密码以获得外线长途线路。)
  3. 在服务器上安装Adobe Reader。
  4. 在服务器上创建一个用户,以便Windows服务运行" as"。我们打电话给我们的用户" FaxServiceUser"。
  5. 至少一次以此FaxServiceUser身份登录服务器。登录后,设置" Adob​​e PDF"设备作为默认打印机。
  6. 此外,以该用户身份登录后,使用Adobe打开PDF文件,然后点击EULA。
  7. 以此用户身份登录,并且打开Adobe Reader时,请更改以下设置:
    • 如果选中,请取消选中"当我启动阅读器时显示消息" (在" General")
    • 取消选中"启用保护模式"启动时复选框(这可能仅适用于Acrobat 10.在Acrobat 11中,此选项已移至安全(增强),并在启动时标题为启用保护模式。只需确保取消选中此选项)
    • 取消选中"启用增强安全性" (在"安全(增强)" - 这可能仅适用于Acrobat 11及更高版本)
    • 选择“更新程序”选项并禁用“自动下载和安装更新”。
    • 取消选中"从网址创建链接" (在" General")
    • 取消勾选"制作手工工具阅读文章" (在" General")
    • 取消选中"当我启动Reader"时显示消息(在" General")
    • 取消选中"自动计算字段值" (在"表格")
    • 取消选中"显示焦点矩形" (在"表格")
    • 取消选中"显示文本字段溢出指示符" (在"表格")
    • 取消选中"启用Acrobat JavaScript" (在" Javascript")
    • 取消选中"显示欢迎对话框" (在"审查")
    • 取消选中"打开文件时显示服务器连接警告对话框" (在"审查")
  8. 如果需要,请参阅此链接以获取有关Adobe Reader设置的帮助:http://kb.faxback.com/How+To+Configure+Adobe+XI+for+Use+with+NET+SatisFAXtion
  9. 在构建,部署和安装Windows服务之后,将服务的属性更改为" as"您之前创建的用户(" FaxServiceUser"在我们的例子中)。
  10. 将该FaxServiceUser的权限添加到需要读取/写入/删除的任何文件夹中。
  11. 由于Adobe本应作为桌面应用程序运行,因此请在服务中添加一些代码以释放Adobe Reader使用的内存(您可以在示例代码的myProcess.Kill()函数中看到我们如何执行此操作)。
  12. 那应该这样做。这有点麻烦,但我希望这给出了一个完整的例子,说明如何将Adobe Reader与自定义Windows服务一起设置,以便从Windows服务器上的pdf文件发送传真。我们已经做了几个月了,没有任何问题。我们的客户收到的传真量很少,所以我无法说出如何使用大量传真。所以,如果你正在寻找一个免费的"发送传真的方式,不用像Interfax这样的东西,这可能是一个可行的选择,至少对于低容量。

答案 2 :(得分:1)

问题似乎与名为" AcroRd32" ,在发送传真之前在Acrobat Reader中打开传真并将其转换为TIFF文件。此过程不会释放内存。

尝试按如下方式停止该过程

body {
  background: linear-gradient(to bottom, #fefefe 0%, #aaaaaa 100%);
  display: flex;
  flex-direction: row;
}

我希望这有用。

答案 3 :(得分:-1)

我还想通过Windows服务使用Faxcomexlib发送传真,但是经过研究,我意识到该Windows库在该服务中不可用,并且我使用了进程监视器来实现这一点,因为我决定使用传真。服务器。要创建一个.exe文件并从服务中调用该文件并向其发送所需的参数,那么我在通过Windows服务调用该进程时遇到了会话问题,然后我解决了该问题,现在通过Windows发送了传真。完成。