FrymasterBadgeApp/Services/PrinterService.cs

108 lines
3.8 KiB
C#

using System.Drawing;
// We move the usings outside the IF for the Language Server,
// but keep the SupportedOSPlatform attribute to satisfy the linker.
using System.Drawing.Printing;
using System.IO;
using System.Runtime.Versioning;
[assembly: SupportedOSPlatform("windows")]
namespace FrymasterBadgeApp.Services;
[SupportedOSPlatform("windows")]
public class PrinterService
{
public PrinterService()
{
AppLogger.Info("PrinterService: Constructor started.");
try
{
var test = System.Drawing.Color.White;
AppLogger.Info("PrinterService: GDI+ Compatibility check passed.");
}
catch (Exception ex)
{
AppLogger.Error("PrinterService: GDI+ Compatibility check FAILED.", ex);
}
}
public void PrintBase64Badge(string frontBase64, string backBase64, string printerName)
{
// Wrap the actual logic in the WINDOWS check so it doesn't try to compile on other platforms
#if WINDOWS
try
{
AppLogger.Info($"PrinterService: Attempting to print to {printerName}");
using (PrintDocument pd = new PrintDocument())
{
pd.PrinterSettings.PrinterName = printerName;
pd.DefaultPageSettings.Landscape = true;
pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
bool frontPrinted = false;
pd.PrintPage += (sender, e) =>
{
try
{
string currentB64 = !frontPrinted ? frontBase64 : backBase64;
using (var ms = new MemoryStream(Convert.FromBase64String(currentB64)))
using (var img = System.Drawing.Image.FromStream(ms))
{
if (img.Height > img.Width)
{
e.Graphics.TranslateTransform(e.PageBounds.Width, 0);
e.Graphics.RotateTransform(90);
e.Graphics.DrawImage(
img,
0,
0,
e.PageBounds.Height,
e.PageBounds.Width
);
}
else
{
e.Graphics.DrawImage(
img,
0,
0,
e.PageBounds.Width,
e.PageBounds.Height
);
}
}
if (!frontPrinted && !string.IsNullOrEmpty(backBase64))
{
frontPrinted = true;
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
catch (Exception ex)
{
AppLogger.Error("PrinterService: Error during PrintPage event", ex);
e.HasMorePages = false;
}
};
pd.Print();
AppLogger.Info("PrinterService: Print job sent to spooler.");
}
}
catch (Exception ex)
{
AppLogger.Error("PrinterService: Critical failure in PrintBase64Badge", ex);
}
#else
AppLogger.Warn("PrinterService: PrintBase64Badge called on non-Windows platform.");
#endif
}
}