2008-11-04 6 views
3

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

Теперь новая версия должна быть службой 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(); 

ответ

0

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

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

0

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

0

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

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

3

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

Во-вторых, отделите решение 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 изображение на странице. Наконец, вы вызываете метод printProcument объекта PrintDocument и уходите.

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

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

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

+0

.Net не поддерживает все вкусы TIFF. – 2008-11-04 18:39:11

0

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

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