it-swarm.com.de

Nice-Quittung in C # WPF zum Drucken auf Thermodrucker POS

Ich versuche, die Druckfunktionalität in einem meiner Projekte zu implementieren, aber bei dieser Art von Arbeit bin ich nicht so gut.

Ich habe bereits eine Verbindung zu meinem Thermodrucker hergestellt und schreibe/drucke dieselben Samples ..__ Nun versuche ich, einen Weg zu finden, wie ich meine Quittung so gestalten kann, dass sie wie eine Quittung aus dem angehängten Bild aussieht.

Ich habe einige Ideen, aber ich bin mir nicht sicher, ob sie für diese Art von Arbeit gut sind. Eine davon ist, zu versuchen, meine Quittung in HTML zu formatieren und ihre Render-HTML wie Bitmap (Bild) zu formatieren und dann auszudrucken. Ich habe dies aber schon versucht Es sieht so aus, als hätte ich einen Qualitätsverlust.

Wenn jemand andere Ideen hat, wie ich die Quittung aus dem Bild aussehen lassen kann, teilen Sie mir bitte diese Informationen mit. Ich werde Ihnen sehr dankbar sein.

Dies ist, was ich bereits gemacht habe, um einige Beispiele zu drucken, für die Formatierung habe ich graphics.DrawString verwendet, aber ich glaube nicht, dass ich damit zu viel erreichen kann.

public void Print()
{
    var doc = new PrintDocument();
    doc.PrintPage += new PrintPageEventHandler(ProvideContent);
    doc.Print();
}

public void ProvideContent(object sender, PrintPageEventArgs e)
{
    Graphics graphics = e.Graphics;
    Font font = new Font("Courier New", 10);

    float fontHeight = font.GetHeight();

    int startX = 0;
    int startY = 0;
    int Offset = 20;

    e.PageSettings.PaperSize.Width = 50;
    graphics.DrawString("Welcome to MSST", new Font("Courier New", 8),
                        new SolidBrush(Color.Black), startX, startY + Offset);
    Offset = Offset + 20;

    graphics.DrawString("Ticket No:" + "4525554654545",
                new Font("Courier New", 14),
                new SolidBrush(Color.Black), startX, startY + Offset);
    Offset = Offset + 20;


    graphics.DrawString("Ticket Date :" + "21/12/215",
                new Font("Courier New", 14),
                new SolidBrush(Color.Black), startX, startY + Offset);

    Offset = Offset + 20;
    String underLine = "------------------------------------------";

    graphics.DrawString(underLine, new Font("Courier New", 14),
                new SolidBrush(Color.Black), startX, startY + Offset);

    Offset = Offset + 20;
    String Grosstotal = "Total Amount to Pay = " + "2566";

    Offset = Offset + 20;
    underLine = "------------------------------------------";
    graphics.DrawString(underLine, new Font("Courier New", 14),
                new SolidBrush(Color.Black), startX, startY + Offset);
    Offset = Offset + 20;

    graphics.DrawString(Grosstotal, new Font("Courier New", 14),
                new SolidBrush(Color.Black), startX, startY + Offset);

}

enter image description here

15
Nic

In der Vergangenheit habe ich dabei die Quittung in separate Teile aufgeteilt, die unterschiedliche Schriftarten oder Ausrichtungen wie Kopfzeile, Textkörper und Fußzeile verwendeten. 

Ich habe das folgende Klassenlayout verwendet, um meine gedruckte Textdefinition einzukapseln. (Woher Sie die Schriftart bekommen und wie Sie die Lebensdauer bestimmen, hängt von Ihnen ab)

public class PrintText
{
    public PrintText(string text, Font font) : this(text, font, new StringFormat()) {}

    public PrintText(string text, Font font, StringFormat stringFormat)
    {
        Text = text;
        Font = font;
        StringFormat = stringFormat;
    }

    public string Text { get; set; }

    public Font Font { get; set; }

    /// <summary> Default is horizontal string formatting </summary>
    public StringFormat StringFormat { get; set; }
}

Wenn es längere Listen von Texten gibt, die die gleiche Schriftart und Polsterung verwenden, macht die Verwendung eines Stringbuilders zum Erstellen des Textes das Leben leicht, sodass Sie sich ein Bild davon machen können, wie Ihr Code aussehen wird.

Wenn Sie statischen Text hatten, können Sie ihn so zusammenfügen:

var sb = new StringBuilder();
sb.AppendLine("Start of receipt");
sb.AppendLine("================");
sb.AppendLine("Item 1");
sb.AppendLine("Item 2");
sb.AppendLine("================");

Oder wenn die Daten in einem Objekt etwas dynamischer sind, können Sie Ihren formatierten Text durchlaufen und anfügen:

private class ReceiptItem
{
    public string Name { get; set; }

    public decimal Cost { get; set; }

    public int Amount { get; set; }

    public int Discount { get; set; }

    public decimal Total { get { return Cost * Amount; } }
}
const int FIRST_COL_PAD = 20;
const int SECOND_COL_PAD = 7;
const int THIRD_COL_PAD = 20;

var sb = new StringBuilder();
sb.AppendLine("Start of receipt");
sb.AppendLine("================");

foreach (var item in receiptItems)
{
    sb.Append(item.Name.PadRight(FIRST_COL_PAD));

    var breakDown = item.Amount > 0 ? item.Amount + "x" + item.Cost : string.Empty;
    sb.Append(breakDown.PadRight(SECOND_COL_PAD));

    sb.AppendLine(string.Format("{0:0.00} A", item.Total).PadLeft(THIRD_COL_PAD));

    if (item.Discount > 0)
    {
        sb.Append(string.Format("DISCOUNT {0:D2}%", item.Discount).PadRight(FIRST_COL_PAD + SECOND_COL_PAD));
        sb.Append(string.Format("{0:0.00} A", -(item.Total / 100 * item.Discount)).PadLeft(THIRD_COL_PAD));
        sb.AppendLine();
    }
}

sb.AppendLine("================");

Die Ausgabe sieht folgendermaßen aus:

Start of receipt
================
Joes Food           1x10      10.00 A
DISCOUNT 10%                  -1.00 A
Fun Facts           1x20      20.00 A
DISCOUNT 15%                  -3.00 A
Bag of Sand         7x40     280.00 A
================

Mit der PrintText-Klasse können wir unsere schön formatierte String Builder-Ausgabe speichern

var printText = new PrintText(sb.ToString(), new Font("Monospace Please...", 8));

Verwenden Sie diese Option schließlich, wenn Sie versuchen, die Zeichenfolge zu zeichnen

var layoutArea = new SizeF(AvailableWidth, 0);
SizeF stringSize = g.MeasureString(printText.Text, printText.Font, layoutArea, printText.StringFormat);

RectangleF rectf = new RectangleF(new PointF(), new SizeF(AvailableWidth, stringSize.Height));

g.DrawString(printText.Text, printText.Font, Brushes.Black, rectf, printText.StringFormat);

Sie können auch mit ein paar verschiedenen grafischen Verbesserungen herumspielen, wenn der Text nicht richtig gedruckt wird, z.

g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
20
laurencee

ich gehe davon aus, dass Sie die Ausgabe nicht auf einem Thermodrucker drucken, sondern mit einem normalen Bitmap-fähigen Drucker. Wenn dies der Fall ist, müssen Sie eine Bitmap/PDF-Datei oder eine andere Grafikbeschreibung generieren, die Sie dann an den Drucker senden können. Da das von Ihnen bereitgestellte Beispielbild nur Text enthält, müssen Sie diesen Text einfach mit Koordinaten und Schriftgrößen anordnen. Das Problem, mit dem Sie konfrontiert werden, besteht jedoch darin, die richtigen Schriftarten zu finden und den Abstand und das Kerning usw. absolut richtig zu bestimmen. Das wäre mein Ausgangspunkt. Sehen Sie, ob Sie eine Schrift finden können, die der im Bild ähnelt. teste es in photoshop/gimp oder ähnlichem. Machen Sie aus Ihrem Foto des Ausdrucks eine Hintergrundebene, und prüfen Sie, ob der Vordergrund gleich ist. Sobald Sie es dort kopieren können, beenden Sie die Software. Wählen Sie die Textkoordinaten aus Ihrem Photoshop-Modell. 

1
morishuz

Sie können den Beleg in ein BitMaps-Bild konvertieren und die Klasse XpsDocuentGenerator verwenden. Oder verwenden Sie eine Open-Source-Bibliothek wie MigraDocs, wo Sie sie in PDF konvertieren und an die Drucker senden 

0
parthap