ActFax
Active Fax
факс

Отправка факсов через ActFax

В продолжение темы 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. Восстанавливаем принтер по умолчанию.

Удачи!

Нравится

Поделиться

3 комментария

Евгений!

Уверен что эта информация очень полезна для многих пользователей Community. Не могли бы Вы привести небольшой прмер кода, который делает все описаное?

"Карло Сергей" написал:Не могли бы Вы привести небольшой прмер кода, который делает все описаное?

По многочисленным просьбам, привожу ... :)

Примечание: необходимо установить DynamicWrapper (http://community.terrasoft.com.ua/node/2402), т.к., к сожалению, не удалось обойтись без него в реализации ф-ции SetDefaultPrinter. Если кто-нибудь предложит еще рабочий вариант - буду безмерно благодарен. В примере есть еще 2 - не рабочих.

[javascript]
// 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);
}

[/javascript]

Евгений, а как можно не показывать само окно отправки факса (с его параметрами), которое показывает сам ActFax?

Показать все комментарии