我之前看过这个问题,但我没有看到任何明确的答案,绝对没有解决我问题的答案。我创建了一个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?
答案 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文件作为传真。其中一些列在一些答案中,但有些则没有,我希望这是一个完整的答案。
myProcess.Kill()
函数中看到我们如何执行此操作)。 那应该这样做。这有点麻烦,但我希望这给出了一个完整的例子,说明如何将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发送了传真。完成。