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





Вот мое решение, я запускаю процесс и жду, пока один из подпроцессов моего процесса Adobe не покажет последнее открытое окно.
Спасибо 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