c # Распечатать PDF с Adobe Reader и закрыть - PullRequest
0 голосов
/ 28 января 2019

Я не нашел хорошего (бесплатного) и простого решения для печати PDF-файлов (например, из «горячей» папки (FileSystemWatcher) на сервере) с помощью Acrobat и закройте Acrobat Reader.Так что я написал свой, и я надеюсь, что это поможет кому-то.(Да, вы можете использовать старую бесплатную версию Foxit Reader, но у нас было слишком много проблем с ней, иногда она зависала в памяти без печати)

Дело в том, что после печати файл должен быть перемещен в архивреж, но Adobe не закрылся.Так что я никогда не знал, когда это будет сделано, или жду 30+ секунд и убью (не так хорошо, если серверу нужно больше времени и много времени).

1 Ответ

0 голосов
/ 28 января 2019

Вот мое решение, я запускаю процесс и жду, пока один из подпроцессов моего Adobe Process покажет последнее открытое окно.

Спасибо mtijn за его решение "Process Searcher" https://stackoverflow.com/a/7189381/480982

var prz = Process.Start("C:\\Program Files (x86)\\Adobe\\Acrobat Reader DC\\Reader\\AcroRd32.exe", "/h /t \"" + YOURPDFFILE + "\" \"" + YOURPRINTER + "\"");

            bool loop = true;
            while (loop)
            {
//u can use Thread.Sleep(x) too;
                prz.WaitForExit(500);

                ManagementObjectSearcher searcher = new ManagementObjectSearcher(
       "SELECT * " +
       "FROM Win32_Process " +
       "WHERE ParentProcessId=" + prz.Id);
                ManagementObjectCollection collection = searcher.Get();
                if (collection.Count > 0)
                {

                    foreach (var item in collection)
                    {
                        UInt32 childProcessId = (UInt32)item["ProcessId"];
                        if ((int)childProcessId != Process.GetCurrentProcess().Id)
                        {

                            Process childProcess = Process.GetProcessById((int)childProcessId);

//If a File is open the Title begins with "Filename - Adobe ...", but after print/closing the recent window starts with "Adobe Acr..."
           if(childProcess.MainWindowTitle.StartsWith("Adobe Acrobat"))
                                {
                                loop = false;
                                break;
                            }


                        }
                    }
                }


            }



           //"Recent" Window found, lets kill the Process
            prz.Kill();


// Now here u can move or Delete the pdf file
...