DRAB/Drab.Logic/Services/PrintService.cs
2025-07-11 10:50:46 +02:00

56 lines
1.9 KiB
C#

using System.Drawing.Printing;
using System.Printing;
using PdfiumViewer;
namespace Drab.Logic.Services;
public class PrintService(IDrabSettings drabSettings) : IPrintService
{
public async Task<PrintDocumentResult> 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<PrintSystemJobInfo> GetPrintJobs(string jobName)
{
var printQueue = LocalPrintServer.GetDefaultPrintQueue();
return printQueue.GetPrintJobInfoCollection()
.Where(x => x.Name == jobName)
.ToList();
}
}