Есть ли функциональность Есть ли печать pdf файла по нескольким запросам C#

#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-файла, используя метод наблюдателя файлов.