108 lines
3.8 KiB
C#
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
|
|
}
|
|
}
|