Chcę wydrukować obrazek przez drukarkę do kart plastikowych - Zebra ZXP 3. Ta drukarka drukuje karty o wielkości 86mm x 54 mm przy użyciu 300 DPI.
Obrazek tworze w taki sposób: (wysokosc i szerokość obrazka jest pobierana z bazy danych a potem konwertowana na pixele w prywatnej metodzie, nie jest to istotne więc podaje na dole wartości w pixelach które lecą do metody, która tworzy obrazek).
badgeWidth = 1016
badgeHeight = 638
var bitmap = new Bitmap(badgeWidth, badgeHeight);
bitmap.SetResolution(300, 300);
SetBackgroundColor(badgeTemplateData, bitmap);
Następnie na tej bitmapie są uruchamiane różne metody, które malują coś na niej (jedne dodają obrazek, drugie tekst, inne np. barcode).
Poniżej jedna z takich metod wszystkie działają analogicznie:
private void SetStringElement(string value, Bitmap bitmap, BadgeElement element)
{
var left = element.Coordinates.Left;
var top = element.Coordinates.Top;
var fontSize = element.ElementStyle.TextSize;
var textColor = new SolidBrush(element.ElementStyle.TextColor);
var font = new Font("Arial", fontSize);
using (Graphics graphic = Graphics.FromImage(bitmap))
{
graphic.DrawString(value, font, textColor, left, top);
}
}
Na samym końcu następuje konwersja do Base64 (pierwsze dwie linie to klasa, która generuje ten obrazek (wszystko to co powyżej))
//This is class which generate Image (look above):
var imageGenerator = new ImageGenerator(badgeTemplate);
var badgeTemplateBitmap = imageGenerator.MapBadgeTemplateToPng(badgeSide);
var memoryStream = new MemoryStream();
badgeTemplateBitmap.Save(memoryStream, ImageFormat.Png);
var byteImage = memoryStream.ToArray();
var badgeTemplateBase64 = Convert.ToBase64String(byteImage);
return badgeTemplateBase64;
Ostatni krok to wywołanie z przeglądarki okna do drukowania - mogę to zrobić jedynie przez js więc używam Ajaxa, który prosi o dostarczenie obrazka a nastepnie tworzy okno z tym obrazkiem i na nim wywołuje drukowanie.
$.ajax({
url: "/Guests/PrintSingleFrontBadgeTemplate",
type: "post",
data: { guestTypeId: guestTypeId, guestId: guestId },
success: function (response) {
var popupWin = window.open('', '_blank', 'width=1200,height=800');
popupWin.document.open();
popupWin.document.write('<html><head></head><body"><img alt="Embedded Image" src="data:image/png;base64,' + response.frontBadgeTemplate + '" /></html>');
popupWin.document.close();
popupWin.print();
popupWin.close();
}
});
NO I NIESTETY... W oknie drukowania obraz jest przepotężny i zajmuje 3 strony... wygląda to tak:
W załączniku przedstawiam jak to się generuje...
Co robię nie tak? Dlaczego obrazek jest taki olbrzymi?