Распечатать TIFF-файл из .Net Windows Service - PullRequest
3 голосов
/ 04 ноября 2008

Мы создали приложение, которое получает несколько файлов в разных форматах: 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();

Ответы [ 5 ]

3 голосов
/ 04 ноября 2008

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

Во-вторых, отказывается от решения 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, пока вы не прочитаете последняя страница) но все это довольно легко и хорошо задокументировано.

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

0 голосов
/ 04 ноября 2008

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

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

0 голосов
/ 04 ноября 2008

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

0 голосов
/ 04 ноября 2008

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

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

0 голосов
/ 04 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...