如何使用FAXCOMEXLib从Windows服务发送PDF传真?
我以前见过这个问题,但我没有看到任何明确的答案,绝对没有任何解决我的问题的答案。我创建了一个Windows服务,使用FAXCOMEXLib livrary发送传真(半自动)。到目前为止,我的服务已成功发送文本文件(.txt)。但是当我尝试发送pdf,jpg或tif文件时,出现“操作失败”错误。在SO中,我已经看到很多关于服务运行的用户权限的讨论。我尝试了很多不同的选项(本地服务,本地用户,具有管理员权限的自定义用户,允许服务与桌面交互)。但似乎没有任何区别。看来该服务没有权限打开相应的应用程序来“打印”pdf,jpg或tif文件。但我只是在猜测。有没有人成功地通过Windows服务中的FAXCOMEXLib发送传真?这里是我的代码发送传真:如何使用FAXCOMEXLib从Windows服务发送PDF传真?
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中打开它们和图片查看器)。如果我在我的开发机器上本地运行,这也可以。当然,在发送(在本地计算机上)之前,会弹出相应的查看器。我的猜测是,由于某种原因,该服务无法打开查看器。有没有人在Windows服务中以这种方式发送PDF?
我想给出一个完整的答案。以前发布的答案有一些解决方案,但是他们没有给出我们为了成功通过传真线路发送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);
还有比这更多的代码在我们的服务,当然。其他代码可以处理回调事件处理程序来跟踪发送/完成/失败传真的状态等,但这是实际启动“发送”的代码的“核心”。
这里是我们对服务器进行的配置更改列表,以使我们的自定义Windows服务正确解码,呈现并将PDF文件作为传真发送。其中一些列在一些答案中,但有些不是,我希望这是一个完整的答案。
- 以管理员身份登录到服务器并在服务器上安装传真服务器角色。
- 确保传真调制解调器设备/卡在服务器上正确安装,并且传真线路处于活动状态。您可能会尝试直接从Windows传真实用程序发送包含文本文件的几个测试传真。 (在我们的例子中,我们遇到了问题,因为我们必须拨打“9”和一个秘密密码才能获得外线长途线路)。
- 在服务器上安装Adobe Reader。
- 在服务器上为用户的Windows服务创建一个用户以运行“as”。我们称我们的用户为“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阅读器所使用的内存添加一些代码(你可以看到我们是如何在示例代码中的
myProcess.Kill()
功能这样做)。
而且应该这样做。这有点麻烦,但我希望这给出了一个完整的例子,说明如何将Adobe Reader与您的自定义Windows服务一起设置为从Windows服务器上的pdf文件发送传真。我们已经做了几个月,现在没有问题。我们的客户的传真量很小,所以我无法说明这种传真如何工作。所以,如果你正在寻找一种“免费”的方式发送传真,而不需要支付像国际文传电讯公司那样的费用,这可能是一个可行的选择,至少对于低数量。
该问题似乎与名为“AcroRd32”的进程相关,该进程在发送Acrobat Reader之前打开传真并将其转换为TIFF文件。这个过程不释放内存。
尝试如下
Dim myProcesses() As Process Dim myProcess As Process
' How to retrieve the program associat with pdf, when i only know the file extension ?
myProcesses = Process.GetProcessesByName("AcroRd32") For Each myProcess In myProcesses
If Date.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks Then
myProcess.Kill()
End If
Next
我希望这是有益停止进程。
我不得不承认,这是我第一次听说过这个解决方案。我会给它一个镜头。让我问一下,这是否因为有另一个用户登录并使用Acrobat Reader? –
Windows在将文档发送出去之前将文档转换为TIFF。它基于关联打开文档。因此,Adobe启动是因为它与PDF相关联。我强烈建议您阅读FAXCOMEXLib – Nawfel
的文档谢谢@Nawfel,我确实意识到它通过关联打开。你有这样的成功吗? –
它被记录在the MSDN article很好。需要发生的不平凡的事情是某些软件需要将文件内容转换为可传真的可打印文本。引用:
您可以作为传真正文发送的文档示例是文本文件(.txt),Microsoft Word文档(.doc)或Microsoft Excel电子表格(.xls)。当您从客户端计算机发送传真时,主体必须与安装在该计算机上的应用程序相关联,并且应用程序必须支持PrintTo动词;否则,传真将失败。
所以你可以做的一个简单的测试是右键单击资源管理器中的文件并查找“打印”命令。接下来将文件拖动到打印机以练习PrintTo动词。如果这些测试失败,那么它不会起作用,您需要安装知道如何打印文件的应用程序。
通过服务执行此操作会对执行打印的应用程序提出额外的要求。有很多人在某项服务中表现不佳。特别是当您尝试打印时,Microsoft强烈建议在服务中永远不要这样做。 Office应用程序最近并没有这样做,这使得MSDN建议已经很弱。
在我的机器上,.tif扩展名与一个UWP应用程序相关联,也不会在服务中工作。鉴于处理这些热门扩展的大量应用程序,最好转到superuser.com并命名特定的扩展,Windows版本和您喜欢使用的应用程序,因此提供良好的建议非常困难。从用户会话这样做肯定是最麻烦的。
感谢您的反馈@Hans。当右键点击pdf文件时有一个“打印”选项。当我从资源管理器中选择它时,它会自动提示我“另存为XPS文件”。我的想法是,我应该有一个选项“打印到传真打印机”,对吗?这可能表明我的传真打印机设置不正确?或者,也许Adobe Reader不支持直接打印? –
您需要阅读帖子的其余部分。但是,Adobe Reader,呃平方,看这个问题的原因没有进一步的。你得到了你所付出的,而且更少。 –
我很欣赏@HansPassant的反馈。这可能与Adobe有关。从Windows资源管理器中,在PDF文件上打印并打开工作(使用Adobe作为关联的应用)。但是当我的服务(甚至是IIS)尝试传真时,我只是收到“Operation Failed”错误。我们很乐意购买能够做到这一点的产品。但是我的项目经理对使用Interfax这样的东西犹豫不决。他不喜欢“每传真”付费的想法。但是一次购买产品不是不可能的。我只是无法找到任何。你知道有没有产品? –
查询年份FAXCOMEXLib支持哪个版本? https://www.interfax.net/en/help/supported_file_types =>的Adobe Acrobat(版本9) 或结帐https://stackoverflow.com/a/988359/336511。 也许你需要通过pdf格式到faxDoc。 –
FAXCOMLib.FaxServer fs = new FAXCOMLib.FaxServer(); FAXCOMLib.FaxDoc fd = newFAXCOMLib.FaxDoc(); int result = 0; fs = new FAXCOMLib.FaxServer(); fs.Connect(“FaxServer1”); FD =(FAXCOMLib.FaxDoc)fs.CreateDocument( “C:\\ documenttofax.pdf”); fd.RecipientName =“John Doe”; fd.FaxNumber =“555-1234”; 尝试{ \t结果= fd.Send(); } finally { \t fs.Disconnect(); } –