如何使用PrintDocument在纸上打印图像

时间:2014-01-29 12:21:55

标签: c# image printing barcode

我的问题是我的代码打印的图像彼此重叠。我不知道如何改变x和y位置。打印机应每行打印3张图像,然后移动到下一行。

 private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        for (int serial = 0; serial < SaveBeforePrint.Count; serial++)
        {
            String intercharacterGap = "0";
            String str = '*' + SaveBeforePrint[serial].ToUpper() + '*';
            int strLength = str.Length;

            for (int i = 0; i < SaveBeforePrint[serial].Length; i++)
            {
                string barcodestring = SaveBeforePrint[serial].ToUpper();
                if (alphabet39.IndexOf(barcodestring[i]) == -1 || barcodestring[i] == '*')
                {
                    e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10);
                    return;
                }
            }

            String encodedString = "";

            for (int i = 0; i < strLength; i++)
            {
                if (i > 0)
                    encodedString += intercharacterGap;

                encodedString += coded39Char[alphabet39.IndexOf(str[i])];
            }

            int encodedStringLength = encodedString.Length;
            int widthOfBarCodeString = 0;
            double wideToNarrowRatio = 3;


            if (align != AlignType.Left)
            {
                for (int i = 0; i < encodedStringLength; i++)
                {
                    if (encodedString[i] == '1')
                        widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight);
                    else
                        widthOfBarCodeString += (int)weight;
                }
            }

            int x = 0;
            int wid = 0;
            int yTop = 0;
            SizeF hSize = e.Graphics.MeasureString(headerText, headerFont);
            SizeF fSize = e.Graphics.MeasureString(code, footerFont);

            int headerX = 0;
            int footerX = 0;
            int printonpage = 0;

            if (align == AlignType.Left)
            {
                x = leftMargin;
                headerX = leftMargin;
                footerX = leftMargin;
            }

            else if (align == AlignType.Center)
            {
                    x = (Width - widthOfBarCodeString) / 2;
                    headerX = (Width - (int)hSize.Width) / 2;
                    footerX = (Width - (int)fSize.Width) / 2;

            }
            else
            {
                x = Width - widthOfBarCodeString - leftMargin;
                headerX = Width - (int)hSize.Width - leftMargin;
                footerX = Width - (int)fSize.Width - leftMargin;
            }

            if (showHeader)
            {
                yTop = (int)hSize.Height + topMargin;
                e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin);
            }
            else
            {
                yTop = topMargin;
            }

            for (int i = 0; i < encodedStringLength; i++)
            {
                    if (encodedString[i] == '1')
                        wid = (int)(wideToNarrowRatio * (int)weight);
                    else
                        wid = (int)weight;

                    e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, yTop, wid, height);

                    x += wid;



            }
            yTop += height;

            if (showFooter)
                e.Graphics.DrawString(SaveBeforePrint[serial], footerFont, Brushes.Black, footerX, yTop);
        }

    }

期望的输出:

enter image description here

我得到了:

enter image description here

如您所见,最后一位数字重叠。我想在前一个旁边绘制它

3 个答案:

答案 0 :(得分:0)

您应该在DataGridView(包含列中的图像)的帮助下完成此操作。 然后,图像将在每个新行或列中打印(通过根据需要进行修改) Follow Class将通过在构造函数中传递整个DataGridView和Header来完成您的工作。

using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Linq;

namespace Waqas
{
    internal class ClsPrint
    {
        #region Variables

        private int iCellHeight = 0; //Used to get/set the datagridview cell height
        private int iTotalWidth = 0; //
        private int iRow = 0; //Used as counter
        private bool bFirstPage = false; //Used to check whether we are printing first page
        private bool bNewPage = false; // Used to check whether we are printing a new page
        private int iHeaderHeight = 0; //Used for the header height
        private StringFormat strFormat; //Used to format the grid rows.
        private ArrayList arrColumnLefts = new ArrayList(); //Used to save left coordinates of columns
        private ArrayList arrColumnWidths = new ArrayList(); //Used to save column widths
        private PrintDocument _printDocument = new PrintDocument();
        private DataGridView gw = new DataGridView();
        private string _ReportHeader;

        #endregion

        public ClsPrint(DataGridView gridview, string ReportHeader)
        {
            _printDocument.DefaultPageSettings.Landscape = true;
            _printDocument.DefaultPageSettings.PaperSize.RawKind = (int)PaperKind.A4;
            _printDocument.DefaultPageSettings.Margins = new Margins(30, 30, 30, 30);

            //_printDocument.DefaultPageSettings.PaperSize.PaperName = "A4";

            _printDocument.PrintPage += new PrintPageEventHandler(_printDocument_PrintPage);
            _printDocument.BeginPrint += new PrintEventHandler(_printDocument_BeginPrint);
            gw = gridview;
            _ReportHeader = ReportHeader;
        }

        public void PrintForm()
        {
            //Open the print preview dialog
            PrintPreviewDialog objPPdialog = new PrintPreviewDialog();
            objPPdialog.Document = _printDocument;
            objPPdialog.ShowIcon = false;
            objPPdialog.Text = "Print Preview";
            objPPdialog.WindowState = FormWindowState.Maximized;
            objPPdialog.ShowDialog();
        }

        private void _printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //try
            //{
            //Set the left margin
            int iLeftMargin = e.MarginBounds.Left;
            //Set the top margin
            int iTopMargin = e.MarginBounds.Top;
            //Whether more pages have to print or not
            bool bMorePagesToPrint = false;
            int iTmpWidth = 0;

            //For the first page to print set the cell width and header height
            if (bFirstPage)
            {
                foreach (DataGridViewColumn GridCol in gw.Columns)
                {
                    iTmpWidth = ((int) (Math.Floor((double) ((double) GridCol.Width/
                                                            (double) iTotalWidth*(double) iTotalWidth*
                                                            ((double) e.MarginBounds.Width/(double) iTotalWidth)))));

                    iHeaderHeight = (int) (e.Graphics.MeasureString(GridCol.HeaderText,
                        GridCol.InheritedStyle.Font, iTmpWidth).Height) + 60;

                    // Save width and height of headers
                    arrColumnLefts.Add(iLeftMargin);
                    arrColumnWidths.Add(iTmpWidth);
                    iLeftMargin += iTmpWidth;
                }
            }
            //Loop till all the grid rows not get printed
            while (iRow <= gw.Rows.Count - 1)
            {
                DataGridViewRow GridRow = gw.Rows[iRow];
                //Set the cell height
                iCellHeight = GridRow.Height + 30;
                int iCount = 0;
                //Check whether the current page settings allows more rows to print
                if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
                {
                    bNewPage = true;
                    bFirstPage = false;
                    bMorePagesToPrint = true;
                    break;
                }
                else
                {

                    if (bNewPage)
                    {
                        //Draw Header
                        e.Graphics.DrawString(_ReportHeader,
                            new Font("Calibri Light", 20, FontStyle.Bold),
                            new SolidBrush(Color.Black), e.MarginBounds.Left,
                            e.MarginBounds.Top+20 - e.Graphics.MeasureString(_ReportHeader,
                                new Font(gw.Font, FontStyle.Bold),
                                e.MarginBounds.Width).Height - 13);

                        String strDate = DateTime.Now.ToString("dd-MMM-yy hh:mm tt");
                        //Draw Date
                        e.Graphics.DrawString(strDate,
                            new Font("Calibri Light", 12, FontStyle.Bold), Brushes.Black,
                            e.MarginBounds.Left-20 +
                            (e.MarginBounds.Width - e.Graphics.MeasureString(strDate,
                                new Font(gw.Font, FontStyle.Bold),
                                e.MarginBounds.Width).Width),
                            e.MarginBounds.Top+30 - e.Graphics.MeasureString(_ReportHeader,
                                new Font(new Font(gw.Font, FontStyle.Bold),
                                    FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                        //Draw Columns                 
                        iTopMargin = e.MarginBounds.Top+30;
                        DataGridViewColumn[] _GridCol = new DataGridViewColumn[gw.Columns.Count];
                        int colcount = 0;
                        //Convert ltr to rtl
                        foreach (DataGridViewColumn GridCol in gw.Columns)
                        {
                            _GridCol[colcount++] = GridCol;
                        }
                        for (int i =0;  i <= (_GridCol.Count() - 1); i++)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.Gainsboro),
                                new Rectangle((int) arrColumnLefts[iCount], iTopMargin,
                                    (int) arrColumnWidths[iCount], iHeaderHeight));

                            e.Graphics.DrawRectangle(new Pen(Color.Black),
                                new Rectangle((int) arrColumnLefts[iCount], iTopMargin,
                                    (int) arrColumnWidths[iCount], iHeaderHeight));

                            e.Graphics.DrawString(_GridCol[i].HeaderText,
                                new Font("Calibri Light", 12, FontStyle.Bold),
                                new SolidBrush(Color.Black),
                                new RectangleF((int) arrColumnLefts[iCount], iTopMargin,
                                    (int) arrColumnWidths[iCount], iHeaderHeight), strFormat);
                            iCount++;
                        }
                        bNewPage = false;
                        iTopMargin += iHeaderHeight;
                    }
                    iCount = 0;
                    DataGridViewCell[] _GridCell = new DataGridViewCell[GridRow.Cells.Count];
                    int cellcount = 0;
                    //Convert ltr to rtl
                    foreach (DataGridViewCell Cel in GridRow.Cells)
                    {
                        _GridCell[cellcount++] = Cel;
                    }
                    //Draw Columns Contents                
                    for (int i =0; i <=(_GridCell.Count() - 1); i++)
                    {
                        if (_GridCell[i].Value != null)
                        {
                            if (_GridCell[i].GetType() != typeof (DataGridViewImageCell))
                            {
                                e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(),
                                    new Font("Calibri Light", 10),
                                    new SolidBrush(Color.Black),
                                    new RectangleF((int) arrColumnLefts[iCount],
                                        (float) iTopMargin,
                                        (int) arrColumnWidths[iCount], (float) iCellHeight),
                                    strFormat);
                            }
                            else
                            {








                                Image img = Common.byteArrayToImage((byte[]) _GridCell[i].Value);
                                Rectangle m = new Rectangle((int) arrColumnLefts[iCount],iTopMargin,
                                                            (int) arrColumnWidths[iCount],  iCellHeight);

                                if ((double)img.Width / (double)img.Height > (double)m.Width / (double)m.Height) // image is wider
                                {
                                    m.Height = (int)((double)img.Height / (double)img.Width * (double)m.Width);
                                }
                                else
                                {
                                    m.Width = (int)((double)img.Width / (double)img.Height * (double)m.Height);
                                }
                                e.Graphics.DrawImage(img, m);








                            }
                        }
                        //Drawing Cells Borders 
                        e.Graphics.DrawRectangle(new Pen(Color.Black),
                            new Rectangle((int) arrColumnLefts[iCount], iTopMargin,
                                (int) arrColumnWidths[iCount], iCellHeight));
                        iCount++;
                    }
                }
                iRow++;
                iTopMargin += iCellHeight;
            }
            //If more lines exist, print another page.
            if (bMorePagesToPrint)
                e.HasMorePages = true;
            else
                e.HasMorePages = false;
            //}
            //catch (Exception exc)
            //{
            //    KryptonMessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK,
            //       MessageBoxIcon.Error);
            //}
        }

        private void _printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            try
            {
                strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Center;
                strFormat.LineAlignment = StringAlignment.Center;
                strFormat.Trimming = StringTrimming.EllipsisCharacter;

                arrColumnLefts.Clear();
                arrColumnWidths.Clear();
                iCellHeight = 0;
                iRow = 0;
                bFirstPage = true;
                bNewPage = true;

                // Calculating Total Widths
                iTotalWidth = 0;
                foreach (DataGridViewColumn dgvGridCol in gw.Columns)
                {
                    iTotalWidth += dgvGridCol.Width;
                }
            }
            catch (Exception ex)
            {
                KryptonMessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

    }
}

作为

ClsPrint _ClsPrint = new ClsPrint(myDataGridView, "MyHeader");
_ClsPrint.PrintForm();

答案 1 :(得分:0)

您的位置变量在循环中被声明为,这意味着它们会在每次循环中被重置。将循环外的X和Y的位置变量保持在serial之上,并根据每个条形码的总宽度(和高度,如果你开始新的条形码行)进行调整。

答案 2 :(得分:0)

我观察了代码并发现问题..在panel1_print中你没有正确递增值..

我已经进行了必要的更改,现在你将获得一行中的4个条和另一行中的第5个 - 检查附图。

enter image description here

只需将此 panel1_Paint 替换为您可以找到更改的新代码。 我把它们标记为

//start changes by Deepak
..
..
..
//end changes by Deepak

并且还将两个变量loopValX和loopValY声明为int

这是代码..

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    int loopValX = 0;
    int loopValY = -150;

    for (int serial = 0; serial < SaveBeforePrint.Count; serial++)
    {
        String intercharacterGap = "0";
        String str = '*' + SaveBeforePrint[serial].ToUpper() + '*';
        int strLength = str.Length;

        for (int i = 0; i < SaveBeforePrint[serial].Length; i++)
        {
            string barcodestring = SaveBeforePrint[serial].ToUpper();
            if (alphabet39.IndexOf(barcodestring[i]) == -1 || barcodestring[i] == '*')
            {
                e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10);
                return;
            }
        }

        String encodedString = "";

        for (int i = 0; i < strLength; i++)
        {
            if (i > 0)
                encodedString += intercharacterGap;

            encodedString += coded39Char[alphabet39.IndexOf(str[i])];
        }

        int encodedStringLength = encodedString.Length;
        int widthOfBarCodeString = 0;
        double wideToNarrowRatio = 3;


        if (align != AlignType.Left)
        {
            for (int i = 0; i < encodedStringLength; i++)
            {
                if (encodedString[i] == '1')
                    widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight);
                else
                    widthOfBarCodeString += (int)weight;
            }
        }


        SizeF hSize = e.Graphics.MeasureString(headerText, headerFont);
        SizeF fSize = e.Graphics.MeasureString(SaveBeforePrint[serial], footerFont);

        int headerX = 0;
        int footerX = 0;

        if (align == AlignType.Left)
        {
            x = leftMargin;
            headerX = leftMargin;
            footerX = leftMargin;
        }

        else if (align == AlignType.Center)
        {
                x = (Width - widthOfBarCodeString) / 2;
                headerX = (Width - (int)hSize.Width) / 2;
                footerX = (Width - (int)fSize.Width) / 2;
        }
        else
        {
            x = Width - widthOfBarCodeString - leftMargin;
            headerX = Width - (int)hSize.Width - leftMargin;
            footerX = Width - (int)fSize.Width - leftMargin;
        }

        if (showHeader)
        {
            y = (int)hSize.Height + topMargin;
            e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin);
        }
        else
        {
            y = topMargin;
        }


        //start changes by Deepak
        if (serial % 4 == 0)
        {
            loopValX = 0;
            loopValY += 150;
        }
        else
        {
            loopValX += 150;
        }

        x += loopValX;
        y += loopValY;
        footerX += loopValX;

        //end changes by Deepak


        for (int i = 0; i < encodedStringLength; i++)
        {
                if (encodedString[i] == '1')
                    wid = (int)(wideToNarrowRatio * (int)weight);
                else
                    wid = (int)weight;

                e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, y, wid, height);

                x += wid;

        }
        y += height;

        if (showFooter)
            e.Graphics.DrawString(SaveBeforePrint[serial], footerFont, Brushes.Black, footerX, y);
    }

}