Search code examples
c#printingthermal-printerreceipt

Print Receipt in table layout c# winforms project


I'm having trouble printing a receipt in an acceptable manner for a winforms application I'm working on, and I'm attaching my code, the receipt i'm printing, and another image of a receipt I want to print something like it

here is my code

 private void printready()
        {
            string welcome = "Thank You For Visiting Dulabk";
            string InvoiceNo = txtInvoiceNo.Text;
            decimal gross = Convert.ToInt32(txtGross.Text);
            decimal net = Convert.ToInt32(txtNet.Text);
            decimal discount = gross - net;
            string InvoiceDate = dateTimePicker1.Value.ToLongDateString();

            int lineHeight = 20;
            int supplementaryLines = 15;

            Bitmap bitm = new Bitmap(welcome.Length * 30, (supplementaryLines + dataGridView1.Rows.Count) * lineHeight);
            StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
            using (Graphics graphic = Graphics.FromImage(bitm))
            {
                int startX = 0;
                int startY = 0;
                int offsetY = 0;
                Font newfont2 = null;
                Font itemFont = null;
                SolidBrush black = null;
                SolidBrush white = null;

                try
                {
                    //Font newfont = new Font("Arial Black", 8);
                    newfont2 = new Font("Calibri", 11);
                    itemFont = new Font("Calibri", 11);

                    black = new SolidBrush(Color.Black);
                    white = new SolidBrush(Color.White);

                    //PointF point = new PointF(40f, 2f);

                    graphic.FillRectangle(white, 0, 0, bitm.Width, bitm.Height);
                    graphic.DrawString("" + InvoiceNo + "رقم الفاتورة ", newfont2, black, startX + 150, startY + offsetY);
                    offsetY = offsetY + lineHeight;

                    //PointF pointPrice = new PointF(15f, 45f);
                    graphic.DrawString("" + InvoiceDate + "", newfont2, black, startX, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                    offsetY = offsetY + lineHeight;

                    graphic.DrawString("إسم المنتج             " + "الكمية      " + "السعر", newfont2, black, startX + 15, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                    offsetY = offsetY + lineHeight;
                    graphic.DrawString("--------------------------------------------------", newfont2, black, startX, startY + offsetY);
                    //PointF pointPname = new PointF(10f, 65f);
                    //PointF pointBar = new PointF(10f, 65f);

                    offsetY = offsetY + lineHeight;
                    offsetY = offsetY + lineHeight;

                    for (int i = 0; i < dataGridView1.Rows.Count; i++)
                    {
                        int ii = 1;
                        ii++;

                        graphic.DrawString(" " + dataGridView1.Rows[i].Cells[3].Value + "  " + dataGridView1.Rows[i].Cells[2].Value + "  " + dataGridView1.Rows[i].Cells[1].Value + "", itemFont,
                                 black, startX + 15, startY + offsetY);
                        offsetY = offsetY + lineHeight;
                    }
                    offsetY = offsetY + lineHeight;
                    graphic.DrawString("--------------------------------------------------", newfont2, black, startX, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                    graphic.DrawString("الإجمالي :" + gross + "", newfont2, black, startX + 15, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                    graphic.DrawString("الخصم :" + discount + "", newfont2, black, startX + 15, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                    graphic.DrawString("الصافي :" + net + "", newfont2, black, startX + 15, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                    offsetY = offsetY + lineHeight;
                    graphic.DrawString("--------------------------------------------------", newfont2, black, startX, startY + offsetY);
                    offsetY = offsetY + lineHeight;
                graphic.DrawString("" + welcome + "", newfont2, black, startX, startY + offsetY);
                offsetY = offsetY + lineHeight;
            }
            finally
            {
                black.Dispose();
                white.Dispose();
                itemFont.Dispose();
                newfont2.Dispose();
            }
        }

        using (MemoryStream Mmst = new MemoryStream())
        {
            bitm.Save("ms", ImageFormat.Jpeg);
            pictureBox1.Image = bitm;
            pictureBox1.Width = bitm.Width;
            pictureBox1.Height = bitm.Height;


        }


    }

now as you see, I have it printing the invoice number and the items that are pulled into the data grid view using a for statement

here is how this code is printing

enter image description here

now I want to create a table layout from the datagridview items to look like this receipt in the image below

enter image description here


Solution

  • What you need is drawing some rectangles on the correct positions to get that design you see in the second receipt.

    You already draw a white-filled rectangle in your code.

    graphic.FillRectangle(white, 0, 0, bitm.Width, bitm.Height);
    

    You just need to repeat that in the correct positions with the correct dimensions to achieve the desired design.

    Here you can see another detailed approach which may help you to draw a rectangle:

    Pen pen = new Pen(Color.Black, 2);
    pen.Alignment = PenAlignment.Inset; //<-- change this to what ever you need
    g.DrawRectangle(pen, rect);
    

    Taken from: Border in DrawRectangle