В продолжение темы http://community.terrasoft.ua/node/2743, об автоматизации отправки факсов из Terrasoft CRM.
К сожалению, WinFax не оправдал мои ожидания, в связи с нестабильностью работы.
Мы нашли альтернативу - ActFax http://www.actfax.com/en/ - работает намного стабильней.
К сожалению, не имеет привычного COM интерфейса - но имеет возможности интеграции с другими приложения http://www.actfax.com/en/installation.html#datafield
Вариантов реализации задачи отправки факсов много.
Приведу алгоритм того варианта, который я посчитал наиболее удобным, по причине:
- простоты;
- возможности отправки любых типов документов, используя установленное ПО ассоциированное с типом документа (MS Office, Adobe Reader и др.);
Итак:
1. Копируем необходимый для отправки файл во временную папку, включая в имя файла атрибуты (datafield) необходимые для отправки факса (номер телефона, тему, приоритет и др.). Атрибуты описаны в файле справки к приложению;
2. Запоминаем, какой принтер сейчас установлен по умолчанию;
3. Устанавливаем виртуальный принтер "ActFax" активным по умолчанию;
4. Отправляем файл на печать, используя ShellExecute. При желании, наслаждаемся видом предварительного просмотра факса в окне приложения;
5. Восстанавливаем принтер по умолчанию.
Удачи!
Евгений!
Уверен что эта информация очень полезна для многих пользователей Community. Не могли бы Вы привести небольшой прмер кода, который делает все описаное?
"Карло Сергей" написал:Не могли бы Вы привести небольшой прмер кода, который делает все описаное?
По многочисленным просьбам, привожу ... :)
Примечание: необходимо установить DynamicWrapper (http://community.terrasoft.com.ua/node/2402), т.к., к сожалению, не удалось обойтись без него в реализации ф-ции SetDefaultPrinter. Если кто-нибудь предложит еще рабочий вариант - буду безмерно благодарен. В примере есть еще 2 - не рабочих.
// Use: scr_FileUtils function GetActFaxDataField(Name, Value) { if (IsEmptyValue(Value)) { return ''; } return '@F' + Name + Value + '@'; } function GetActFaxDataFields(Number, To, Subject) { return GetActFaxDataField('211', Number) + GetActFaxDataField('201', To) + GetActFaxDataField('307', Subject) + GetActFaxDataField('501', 2); } function SetDefaultPrinter(PrinterName) { var WinApi = new ActiveXObject('DynamicWrapper'); WinApi.Register('winspool.drv', 'SetDefaultPrinter', 'i=s', 'f=s', 'r=l'); WinApi.SetDefaultPrinter(PrinterName); // 1. // var WshShell = new ActiveXObject('WScript.Shell'); // var RegPathWinNT = // "HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Device"; // WshShell.RegWrite(RegPathWinNT, PrinterName); // 2. // var WshNetwork = new ActiveXObject('WScript.Network'); // WshNetwork.SetDefaultPrinter(PrinterName); } function GetDefaultPrinter() { var RegPathWinNT = "HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Device"; var WshShell = new ActiveXObject('WScript.Shell'); var DefaultPrinter = WshShell.RegRead(RegPathWinNT); var CommaIndex = DefaultPrinter.indexOf(','); if (CommaIndex > 1) { DefaultPrinter = DefaultPrinter.substr(0, CommaIndex); } return DefaultPrinter; } function SendActFaxFromFile(Number, FileName, To, Subject) { if (IsEmptyValue(Number)) { return false; } if (IsEmptyValue(FileName)) { return false; } if (!CheckFileExists(FileName)) { return false; } // Получение параметров для отправки факса var DataFields = GetActFaxDataFields(Number, To, Subject); // Копирование файла во временную папку // В название включаются параметры для отправки факса var FileSystemObject = GetFileSystemObject(); var FileBaseName = FileSystemObject.GetBaseName(FileName); var FileExtensionName = FileSystemObject.GetExtensionName(FileName); var ParamFileName = System.GetTempFileName(FileBaseName + DataFields, FileExtensionName); FileSystemObject.CopyFile(FileName, ParamFileName); var DefaultPrinter = GetDefaultPrinter(); SetDefaultPrinter('ActiveFax'); try { var Shell = new ActiveXObject('Shell.Application'); Shell.ShellExecute(ParamFileName, '', '', 'print', 0); System.Sleep(100); } finally { SetDefaultPrinter(DefaultPrinter); } // TODO: Удалять временный файл после отправки // FileSystemObject.DeleteFile(ParamFileName, true); }
Евгений, а как можно не показывать само окно отправки факса (с его параметрами), которое показывает сам ActFax?