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