Распечатайте TIFF-файл из службы .Net Windows.

Мы создали приложение, которое получает несколько файлов в разных форматах: pdf, tiff, jpeg, doc и т. д. После получения они конвертируются в файлы tiff с помощью стороннего драйвера печати, который устанавливается локально на сервере и настраивается как принтер по умолчанию. Для этого мы открываем System.Diagnostics.Process с командной строкой и аргументами для печати файла с соответствующим приложением.

Теперь новая версия должна быть службой Windows, и пока все работает нормально, кроме части печати. Всякий раз, когда процесс запускается, он никогда не вызывает исключения, и кажется, что все работает нормально, но файл никогда не распечатывается. Если я открою диспетчер задач, я увижу, что MS Paint был выполнен (в случае файла jpeg), но не имеет выходного файла tiff.

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

Любая помощь будет оценена. Серхио Ромеро

Код, который мы используем, выглядит следующим образом:

private const string PROCESS_COMMAND = "mspaint.exe";  
private const string PROCESS_ARGUMENTS = @"""{0}""";  

Process proc = new Process();  
ProcessStartInfo startInfo = new ProcessStartInfo();  
string error = string.Empty;  

startInfo.FileName = PROCESS_COMMAND;  
startInfo.Arguments = string.Format(PROCESS_ARGUMENTS, fileFullPath);  
startInfo.UseShellExecute = false;  
startInfo.RedirectStandardError = true;  

proc.EnableRaisingEvents = false;  
proc.StartInfo = startInfo;  

proc.Start();  

using(StreamReader errorReader = proc.StandardError)  
{  
    string standardError = string.Empty;  
    while((standardError = errorReader.ReadLine()) != null)  
    {  
        error += standardError + " ";  
    }  
}  
proc.WaitForExit();

person Community    schedule 04.11.2008    source источник


Ответы (5)


Первое, что я предлагаю, это запустить службу в контексте определенного пользователя. Затем войдите на сервер как этот пользователь и убедитесь, что принтер установлен, установлен по умолчанию и т. д.

Во-вторых, откажитесь от решения MS Paint, чтобы все упростить. Вы можете загрузить изображение в .NET с помощью System.Drawing.Image.FromFile(YourImageFilePath) и использовать PrintDocument, чтобы сделать все остальное...

Создайте объект PrintDocument, определите свои настройки (какой принтер использовать, поля и т. д.), добавьте обработчик для события PrintPage документа, который делает что-то вроде e.Graphics.DrawImage(YourTiffImageObject, New Rectangle(0, 0, e.MarginBounds.Width, e.MarginBounds.Height)) для рисования изображения TIFF на странице. Наконец, вы вызываете метод .Print вашего объекта PrintDocument, и все готово.

Таким образом, .NET обрабатывает печать, а не какое-то случайное стороннее приложение.

Есть некоторые незначительные изменения кода, когда вы имеете дело с более чем одной страницей за раз (в основном вызов SelectActiveFrom для изменения страницы в многостраничных TIFF и установка e.HasMorePages = True в событии PrintPage, пока вы не прочитаете последнюю страницу) но все это довольно легко и хорошо документировано.

ОБНОВЛЕНИЕ: Просто для полноты картины я должен добавить то, что уже упоминали другие... Некоторым приложениям для правильной работы может потребоваться доступ к рабочему столу. Если вы придерживаетесь MS Paint, вам может потребоваться включить «Разрешить взаимодействие службы с рабочим столом» в свойствах службы.

person Kevin Fairchild    schedule 04.11.2008
comment
.Net поддерживает не все разновидности TIFF. - person Joel Lucsy; 04.11.2008
comment
Джоэл, поскольку он сам конвертирует их в .TIFF, это не должно быть большой проблемой. - person Kevin Fairchild; 04.11.2008

Я не уверен насчет MSPaint... но если ваше приложение работает как консольное приложение, а не как служба, есть вероятность, что сервер не имеет разрешения делать то, что делает ваша учетная запись пользователя.

Возможно, вы захотите попробовать войти в службу, чтобы исключить проблемы с разрешениями.

person bobwienholt    schedule 04.11.2008

Проверьте, имеет ли пользователь, использованный для установки службы, соответствующие разрешения на печать И/ИЛИ доступ к файлам, я бы также рекомендовал использовать ведение журнала событий.

person Oscar Cabrero    schedule 04.11.2008

Открывается ли MSPaint при запуске из консольного приложения? Если это так, возможно, это потому, что ваша служба работает без головы; у него нет прав на отображение пользовательского интерфейса. Таким образом, MSPaint в основном выручает, поскольку он не может открыть свой пользовательский интерфейс без ошибок.

Почему бы просто не распечатать его прямо из .NET? Это можно сделать из сервиса. Однако есть некоторые предупреждения о том, что System.Printing не предназначен для использования службой. Я не уверен, почему, тхо. Раньше делал без проблем...

person Community    schedule 04.11.2008

Мы сталкивались со всевозможными проблемами, когда службы пытались запускать приложения. Часто используется безопасность/учетные данные, или это может быть что-то вроде включения «Разрешить сервису взаимодействовать с рабочим столом», поскольку это может понадобиться приложению (в данном случае mspaint).

При этом я согласен с Кевином, отказаться от MSPaint и либо печатать изначально в .NET, либо, если это просто вопрос преобразования, конвертировать с помощью .NET. Другой вариант — рассмотреть что-то более сложное, чем MSPaint, с такими библиотеками, как LibTIFF или даже с такими вещами, как Ghostscript, для обработки форматов, которые могут не поддерживаться внутри .NET, таких как PDF.

person Douglas Anderson    schedule 04.11.2008