Как отправить факс для pdf из службы Windows с помощью FAXCOMEXLib?

Я видел этот вопрос заданный раньше, но я не видел никаких определенных ответов, и определенно не любые ответы, которые решают мою проблему. Я создал службу windows для отправки факсов (полуавтоматически) с помощью faxcomexlib livrary. До сих пор мой сервис успешно отправлял текстовые файлы (.формат txt.) Но когда я пытаюсь отправить pdf, jpg или tif-файлы, я получаю ошибку "операция не удалась". В SO я видел много дискуссий о разрешениях пользователя, под которым работает служба. Я пробовал много разных вариантов (локальная служба, локальный пользователь, пользователь с правами администратора, разрешить службе взаимодействовать с рабочим столом). Но, кажется, ничто не имеет значения. Похоже, что у службы нет разрешений на открытие соответствующего приложения для "печати" файла pdf, jpg или tif. Но я только предполагаю. Кто-нибудь успешно отправил факс через FAXCOMEXLib в службе Windows? Вот мой код, который отправляет факс:

fileName = @"D:tempFaxTest.txt"; //THIS WORKS
//fileName = @"D:tempFaxTest.pdf"; //Operation failed
//fileName = @"D:tempFaxTest.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). И это также отлично работает, если я запускаю это локально на своей машине dev. И, конечно же, соответствующий просмотрщик появляется перед отправкой (на моем локальном компьютере). Я предполагаю, что по какой-то причине сервис не может открыть зрителя. Кто-нибудь успешно отправил PDF-файл таким образом в службе Windows?

3 ответов


это задокументировано довольно хорошо в статья MSDN. Нетривиальная вещь, которая должна произойти, это некоторые программное обеспечение должно преобразовать содержимое файла в печатный текст, который может быть отправлен по факсу. Цитата:

примеры документов, которые можно отправить как тело факса, являются текстовым файлом (.txt), документ Microsoft Word (.doc) или электронная таблица Microsoft Excel (.xls). При отправке факса с клиентского компьютера тело должно быть связано с приложение, установленное на этом компьютере, и приложение должно поддерживать глагола печать; в противном случае факс будет выполнена.

таким образом, один простой тест, который вы можете сделать, это щелкнуть правой кнопкой мыши файл в Проводнике и искать команду "печать". Затем перетащите файл на принтер, чтобы выполнить команду PrintTo. Если этот тест не удастся, он не будет работать, и вам нужно установить приложение, которое знает, как распечатать файл.

делаешь это из службы увеличивает требования к приложению, которое выполняет печать. Есть много из них, которые не ведут себя особенно хорошо в службе. Особенно при попытке печати Корпорация Майкрософт настоятельно рекомендует никогда не делать этого в службе. Приложения Office, например, в последнее время не делают совет MSDN уже слабым соусом.

на моей машине .расширение tif связано с приложением UWP, которое также не будет работать в службе. Давать хорошие советы трудно, учитывая большое количество приложений что обрабатывать эти популярные расширения, лучше всего перейти к superuser.com и назовите конкретное расширение, версию Windows и приложение, которое вы предпочитаете использовать. Выполнение этого из сеанса пользователя, безусловно, наименее хлопотно.


Я хочу, чтобы дать полный ответ на этот вопрос. Ранее опубликованные ответы имели некоторое решение, но они не дали полной картины всего, что нам нужно было сделать, чтобы успешно отправить pdf-файл через факс-линию, используя FAXCOMEXLib в нашей пользовательской службе Windows.

Я хочу начать с того, что 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-файлы в виде факсов. Некоторые из них перечислены в некоторые ответы, но некоторые нет, и я хотел, чтобы это был полный ответ.

  1. войдите как администратор на сервер и установите роль сервера факсов на сервере.
  2. убедитесь, что факс-модем/карта установлена на сервере, и что факс-линия активна. Вы можете просто попытаться отправить пару тестовых факсов с текстовыми файлами непосредственно из утилиты Windows Fax. (В нашем случае мы столкнулись с проблемами, потому что нам пришлось набрать "9" и секретный код, чтобы получить внешнюю, междугороднюю линию).
  3. установите Adobe Reader на сервере.
  4. создайте пользователя на сервере для запуска службы Windows "как". Мы назвали нашего пользователя "FaxServiceUser".
  5. войдите на сервер как этот FaxServiceUser по крайней мере однажды. При входе в систему установите устройство "Adobe PDF" в качестве принтера по умолчанию.
  6. также при входе в систему как этот пользователь, откройте файл PDF с помощью Adobe и нажмите через EULA.
  7. при входе в систему в качестве этого пользователя и при открытии Adobe Reader измените эти параметры:
    • если отмечено, снимите флажок " показывать мне сообщения при запуске Reader "(в разделе"Общие")
    • снимите флажок "Включить защищенный режим" при запуске (это может относиться только к Программа Acrobat 10. В Acrobat 11 эта опция была перемещена в Security (Enhanced) и называется Enable Protected Mode при запуске. Просто убедитесь, что вы не проверяете эту опцию)
    • снимите флажок "Включить повышенную безопасность" (в разделе "Безопасность(повышенная)" - это может применяться только к Acrobat 11 и выше)
    • выберите опцию Updater и отключите автоматическую загрузку и установку обновлений.
    • снимите флажок "создавать ссылки из URL-адресов" (в разделе "Общие")
    • снимите флажок "сделать Ручной инструмент читать статьи" (В разделе "Общие")
    • снимите флажок "показывать сообщения при запуске Reader" (в разделе "Общие")
    • снимите флажок " Автоматически вычислять значения полей "(в разделе "Формы")
    • снимите флажок "показывать прямоугольники фокуса" (в разделе "Формы")
    • отменить проверку "показать индикатор переполнения текстового поля" (в разделе "Формы")
    • снимите флажок " Включить Acrobat JavaScript "(в разделе "Javascript")
    • снимите флажок " Показать диалог приветствия "(под "Reviewing")
    • снимите флажок " показывать диалоговое окно предупреждения о подключении сервера при открытии файла "(в разделе"Обзор")
  8. при необходимости обратитесь по этой ссылке за помощью в настройках Adobe Reader:http://kb.faxback.com/How + to + настройка + Adobe + XI+для + использования+с + NET + SatisFAXtion
  9. после создания, развертывания и установки службы Windows измените свойства службы для запуска" как " пользователя, созданного ранее ("FaxServiceUser" в нашем случае).
  10. добавьте разрешения для этого FaxServiceUser в любую из папок, которые ему нужны для чтения/записи/удаления из / в.
  11. поскольку Adobe предназначена для запуска в качестве настольного приложения, добавьте код в свою службу, чтобы освободить память, используемую Adobe Reader (вы можете увидеть, как мы это сделали в

проблема, по-видимому , связана с процессом с именем "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

Я надеюсь, что это полезно.