Drukowanie obrazka wygenerowanego w c# o nietypowym wymiarze

0

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?

0

zapisz sobie gotowy obrazek do pliku i zobacz jak on wygląda. BTW może to ten problem https://www.google.pl/search?q=c%23+bitmap+setresolution+not+working

0

Obrazek wygląda tak jak właśnie powinien, czyli ma rozdzielczość o której pisałem powyżej...
Co ciekawe jak go chce drukować z dysku to dostosowuje się do całej strony.
Ale to chyba dlatego, że jest tam opcja:
Rozmiar zdjęcia cała strona, a jak zmienie z cała strona na np. 9x13 cm to jest informacja, że zdjęcie nie mieści się na papierze

1 użytkowników online, w tym zalogowanych: 0, gości: 1