Публикация

Отправка факсов через 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 - не рабочих.

// 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?

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