using System.Drawing.Printing; using System.Printing; using PdfiumViewer; namespace Drab.Logic.Services; public class PrintService(IDrabSettings drabSettings) : IPrintService { public async Task PrintPdf(PrintDocumentRequest request) { try { var oldJobs = GetPrintJobs(request.DokId.ToString()); if (oldJobs.Any(x => !x.IsRetained)) { oldJobs.ForEach(x => x.Cancel()); await Task.Delay(TimeSpan.FromSeconds(2)); } var (filePath, dokId) = request; using (var document = PdfDocument.Load(filePath)) { using (var printDocument = document.CreatePrintDocument()) { var fileName = Path.GetFileName(filePath); printDocument.PrinterSettings.PrintFileName = fileName; printDocument.DocumentName = dokId.ToString(); printDocument.PrintController = new StandardPrintController(); printDocument.Print(); } } await Task.Delay(TimeSpan.FromSeconds(drabSettings.PrinterTimeoutSeconds)); var jobs = GetPrintJobs(request.DokId.ToString()); if (jobs.Count == 0) return new PrintDocumentResult(true, "Print success."); jobs.ForEach(x => x.Cancel()); return new PrintDocumentResult(false, "Print failed - timeout expired."); } catch (Exception e) { return new PrintDocumentResult(false, $"Print failed - {e.Message}"); } } private static List GetPrintJobs(string jobName) { var printQueue = LocalPrintServer.GetDefaultPrintQueue(); return printQueue.GetPrintJobInfoCollection() .Where(x => x.Name == jobName) .ToList(); } }