如何使用PrintDocument在纸上打印图像 [英] How to Print images on paper using PrintDocument

查看:157
本文介绍了如何使用PrintDocument在纸上打印图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My problem is that is that my code prints the images overlapping each other. I do not know how to change the x and y positions. The printer should print 3 images per row and then move to the next row.

 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);
        }

    }

所需输出:

我得到:

正如您所看到的,最后一位数字是重叠的。我想在前一个旁边绘制它

As you can see the last digit is overlapping. I want to draw it next to the previous one

推荐答案

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

I have observed the code and found the issue.. in panel1_print u are not incrementing the values properly..

我已经做了所需的更改,你将获得一行中的4个条和另一行中的第5个 - 检查附加的图像。

I have made the required changes now u will get the 4 bar in a line and 5th one in another line - check the attached image.

只需用你的新代码替换你的 panel1_Paint 即可找到更改..
我已将它们标记为

just replace ur panel1_Paint with this new code thats it you can find the changes.. I have marked them as

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

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

and also declare two variables loopValX and loopValY as 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);
    }

}

这篇关于如何使用PrintDocument在纸上打印图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆