//REF:https://stackoverflow.com/a/6106155/288936
public static void Print(string filePath)
{
Status = PrintJobStatus.Printing;
Message = string.Empty;
try
{
logger.Debug($"Printing... {filePath}");
ProcessStartInfo info = new ProcessStartInfo();
info.Verb = "print";
info.FileName = filePath;
info.CreateNoWindow = true;
info.WindowStyle = ProcessWindowStyle.Hidden;
Process p = new Process();
p.StartInfo = info;
p.Start();
p.WaitForInputIdle();
//以下邏輯克服無法得知Acrobat Reader或Foxit Reader是否列印完成的問題
//最多等待180秒(假設所有檔案可在3分鐘內印完)
var timeOut = DateTime.Now.AddSeconds(180);
bool printing = false; //是否開始列印
bool done = false; //是否列印完成
//取純檔名部分,跟PrintQueue進行比對
string pureFileName = Path.GetFileName(filePath);
//限定最大等待時間
while (DateTime.Now.CompareTo(timeOut) < 0)
{
if (!printing)
{
//未開始列印前發現檔名相同的列印工作
if (CheckPrintQueue(pureFileName))
{
printing = true;
Console.WriteLine($"[{pureFileName}]列印中...");
}
}
else
{
//已開始列印後,同檔名列印工作消失表示列印完成
if (!CheckPrintQueue(pureFileName))
{
done = true;
Console.WriteLine($"[{pureFileName}]列印完成");
break;
}
}
System.Threading.Thread.Sleep(100);
}
try
{
//若程序尚未關閉,強制關閉之
if (false == p.CloseMainWindow())
p.Kill();
}
catch
{
}
if (!done)
{
Console.WriteLine($"無法確認報表[{pureFileName}]列印狀態!");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {DateTime.Now:HH:mm:ss} {ex.Message}");
}
}
//需查詢 WMI 記得加入參照及 using System.Management;
private static bool CheckPrintQueue(string file)
{
//尋找PrintQueue有沒有檔案相同的列印工作
string searchQuery =
"SELECT * FROM Win32_PrintJob";
var printJobs =
new ManagementObjectSearcher(searchQuery).Get();
return printJobs.Any(o => (string)o.Properties["Document"].Value == file);
}