#c# #printing #network-printers
Вопрос:
Привет всем, Каков мой сценарий, я пытаюсь распечатать PDF-файл Из консольного приложения, это программа для просмотра файлов. На самом деле я помещаю Xml в определенный физический путь, как только Xml-файл создается в этой папке, запускается действие наблюдателя за файлами. Прочитайте содержимое XML, например имя принтера и файл печати. На основе этого файла, отправленного на принтер. В чем моя проблема, если я дам несколько запросов, сначала один или два файла не будут отправлены в очередь принтера.немедленно отправьте еще один множественный запрос, чтобы все файлы были отправлены в очередь принтера. Через 15 или 30 минут возникает та же проблема, сначала один или два файла не отправляются на принтер. Мой код,
public static void FileWatcherfunction()
{
string strprintpath = ConfigurationManager.AppSettings["Schedulepath"];
strprintpath = strprintpath @"print";
//Console.WriteLine("config path:: " strprintpath);
Logger.Log("Print path : " strprintpath);
_fileWatcher = new FileSystemWatcher(strprintpath);
_fileWatcher.Created = new FileSystemEventHandler(_fileWatcher_Created);
_fileWatcher.Deleted = new FileSystemEventHandler(_fileWatcher_Deleted);
}
private static void _fileWatcher_Created(object sender, FileSystemEventArgs e)
{
Printfile(strPrinterName, strPrintFileName);
}
private static void Printfile(String strPrinterName, String strPrintFileName)
{
if (File.Exists(strPrintFileName))
{
Process p = new Process();
try
{
strFileType = strPrintFileName.Substring(strPrintFileName.Length - 3);
Logger.Log("strFileType:" strFileType);
p.StartInfo.FileName = strPrintFileName;
p.StartInfo.Verb = "PrintTo";
p.StartInfo.UseShellExecute = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.Arguments = """ strPrinterName """;
p.Start();
iStartProcId = p.Id;
Logger.Log("iStartProcId:" iStartProcId) ;
p.WaitForExit(15000);
Logger.Log("This document has been sent to the printer : " strPrinterName);
p.EnableRaisingEvents = true;
// p.WaitForInputIdle();
if (strFileType.ToUpper() =="PDF")
{
Logger.Log("FileType is PDF: ");
if (!p.HasExited)
{
try
{
KillAdobe("AcroRd32", iStartProcId);
}
catch (Exception killex)
{
}
p.CloseMainWindow();
p.Close();
}
}
Logger.Log("Printing process completed");
}
catch (Exception exp)
{
KillAdobe("AcroRd32", iStartProcId);
Logger.Log("Error: Exception: " exp.Message);
}
}
}
Ответ №1:
Как создаются и обрабатываются xml-файлы? Имейте в виду, FileSystemWatcher.Created
что событие не обязательно означает, что ваш xml-файл завершен. Из документов:
Событие onCreated вызывается сразу же после создания файла. Если файл копируется или переносится в отслеживаемый каталог, событие onCreated будет немедленно вызвано, за которым последует одно или несколько событий OnChanged.
Некоторые другие замечания:
- Получите расширение имени файла с помощью Path.getExtension
- Сравните расширение со строкой.Равно(строка, строка, сравнение строк) и
StringComparison.OrdinalIgnoreCase
.String.ToUpper
создает новую строку — она вам не нужна - 15 секунд для печати документа иногда может быть недостаточно. Я бы подождал дольше. Еще одна ловушка может заключаться в том, что acrord32.exe не завершается немедленно, он может оставаться в фоновом режиме в ожидании других операций. Возможно, вам никогда не следует убивать процесс, вы не проверяете код выхода
- Учтите, что на терминальном сервере вы можете получить целую кучу acrord32.exe процессы из других сеансов тоже, в зависимости от ваших привилегий. Уничтожение процессов по имени может быть проблемой в этом случае — если ваш
KillAdobe
метод делает это - Процесс.CloseMainWindow не завершит процесс без какого-либо пользовательского интерфейса или если процесс больше не реагирует на сообщения окна, а также может вызвать исключение
Process.HasExited
это не обязательно означает, что процесс печати завершен. Также может быть так, что недавно запущенное приложение передает запрос уже запущенному экземпляру и завершает работу до завершения печати- Наблюдатель файловой системы также может стать проблемой, см. Событие ошибки
Комментарии:
1. Привет, Стив, XML-файл, созданный в нашей логике приложения. Как только XML-файл сгенерирован, запускается наблюдатель за файлами.я дал некоторую задержку для чтения этого XML-файла, используя метод наблюдателя файлов.