1. 程式人生 > >C#利用Zxing.net生成條形碼和二維碼並實現列印的功能

C#利用Zxing.net生成條形碼和二維碼並實現列印的功能

    開篇:zxing.net是.net平臺下編解條形碼和二維碼的工具。

Step1:使用VS2010新建一個窗體程式專案:

Step2:新增三個類:分別是BarCodeClass.cs、DocementBase.cs、imageDocument.cs。(下一步貼出這些類的程式碼);;;;新增下載回來的引用zxing.dll。

》說明:

《1》   BarCodeClass.cs主要用來實現條形碼和二維碼的生成和解析。

《2》   DocementBase.cs、imageDocument.cs這兩個類是用來實現對生成的條形碼和二維碼進行列印。

Step3:編寫上一步的三個類的程式碼:

》BarCodeClass.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ZXing.Common;

using ZXing;

using System.Windows.Forms;

using System.Drawing;

using System.Text.RegularExpressions;

using ZXing.QrCode;

namespace BarCode

{

    class BarCodeClass

    {

        ///<summary>

        ///生成條形碼

        ///</summary>

        ///<paramname="pictureBox1"></param>

        ///<paramname="Contents"></param>

        public void CreateBarCode(PictureBoxpictureBox1,string Contents)

        {

            Regexrg = new Regex("^[0-9]{12}$"

);

            if(!rg.IsMatch(Contents))

             {

                 MessageBox.Show("本例子採用EAN_13編碼,需要輸入12位數字");

                 return;

             }

            EncodingOptionsoptions =null;

            BarcodeWriterwriter =null;

            options = newEncodingOptions

            {

                Width = pictureBox1.Width,

                Height = pictureBox1.Height

            };

            writer = newBarcodeWriter();

            writer.Format = BarcodeFormat.ITF;

            writer.Options = options;

            Bitmapbitmap = writer.Write(Contents);

            pictureBox1.Image = bitmap; 

        }

        ///<summary>

        ///生成二維碼

        ///</summary>

        ///<paramname="pictureBox1"></param>

        ///<paramname="Contents"></param>

        public void CreateQuickMark(PictureBoxpictureBox1,string Contents)

        {

            if(Contents == string.Empty)

            {

                MessageBox.Show("輸入內容不能為空!");

                return;

            }

            EncodingOptionsoptions =null;

            BarcodeWriterwriter =null;

            options = newQrCodeEncodingOptions

           {

               DisableECI = true,

               CharacterSet = "UTF-8",

               Width = pictureBox1.Width,

               Height = pictureBox1.Height

           };

            writer = newBarcodeWriter();

            writer.Format = BarcodeFormat.QR_CODE;

            writer.Options = options;

            Bitmapbitmap = writer.Write(Contents);

            pictureBox1.Image = bitmap;

        }

        ///<summary>

        ///解碼

        ///</summary>

        ///<paramname="pictureBox1"></param>

        public void Decode(PictureBoxpictureBox1)

        {

            BarcodeReaderreader =new BarcodeReader();

            Resultresult = reader.Decode((Bitmap)pictureBox1.Image);

        }

    }

}

》DocementBase.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing.Printing;

using System.Drawing;

using System.Windows.Forms;

namespace BarCode

{

    class DocementBase : PrintDocument

    {

        //fields

        public Font Font = new Font("Verdana",10, GraphicsUnit.Point);

        //預覽列印

        public DialogResult showPrintPreviewDialog()

        {

            PrintPreviewDialogdialog =new PrintPreviewDialog();

            dialog.Document = this;

            returndialog.ShowDialog();

        }

        //先設定後列印

        public DialogResult ShowPageSettingsDialog()

        {

            PageSetupDialogdialog =new PageSetupDialog();

            dialog.Document = this;

            returndialog.ShowDialog();

        }

    }

}

》imageDocument.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

using System.Drawing.Printing;

namespace BarCode

{

    class imageDocument : DocementBase

    {

        privateImage _Image;

        public Image Image

        {

            get

            {

                return_Image;

            }

            set

            {

                _Image = value;

                if(_Image != null)

                {

                    if(_Image.Size.Width > _Image.Size.Height)

                       DefaultPageSettings.Landscape = true;

                    else

                       DefaultPageSettings.Landscape = false;

                }

            }

        }

        publicimageDocument()

        {

        }

        publicimageDocument(Image image)

        {

            this.Image= image;

        }

        protectedoverridevoidOnPrintPage(PrintPageEventArgs e)

        {

            if(Image == null)

            {

                thrownewInvalidOperationException();

            }

            RectanglebestFit = GetBestFitRectangle(e.MarginBounds, Image.Size);

            e.Graphics.DrawImage(Image, bestFit);

            e.Graphics.DrawRectangle(Pens.Black, bestFit);

            e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds);

        }

       // 保持高度比:引數為(列印邊界的Rectangularle物件,影象大小的Size物件)

        protectedRectangle GetBestFitRectangle(Rectangle toContain,SizeobjectSize)

        {

            //檢查頁面是水平還是豎直的。

            boolcontainerLandscape =false;

            if(toContain.Width > toContain.Height)

                containerLandscape = true;

            //高度比=影象的高/影象的寬

            floataspectRatio = (float)objectSize.Height / (float)objectSize.Width;

            //得到頁面左上角的座標

            intmidContainerX = toContain.Left + (toContain.Width / 2);

            intmidContainerY = toContain.Top + (toContain.Height / 2);

            intx1 = 0, x2 = 0, y1 = 0, y2 = 0;

            if(containerLandscape ==false)

            {

                //豎直影象

                x1 = toContain.Left;

                x2 = toContain.Right;

                //調整之後的height

                intadjustedHeight = (int)((float)toContain.Width * aspectRatio);

                y1 = midContainerY -(adjustedHeight / 2);

                y2 = y1 + adjustedHeight;

            }

            else

            {

                y1 = toContain.Top;

                y2 = toContain.Bottom;

                //調整之後的height

                intadjustedWidth = (int)((float)toContain.Height/ aspectRatio);

                x1 = midContainerX -(adjustedWidth / 2);

                x2 = x1 + adjustedWidth;

            }

            returnnewRectangle(x1,y1, x2 - x1, y2 - y1);

        }

    }

}

Step4:修改介面。

Step5:依次雙擊【生成條形碼】、【生成二維碼】、【解碼】、【列印】等按鈕,進入Click事件,編寫後臺程式碼。這裡不再一一講述如何實現。程式碼參照下一步:

Step6:貼出窗體的全部程式碼。

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Text.RegularExpressions;

using ZXing;

using ZXing.QrCode.Internal;

using ZXing.Common;

using System.IO;

using ZXing.QrCode;

namespace BarCode

{

    public partial class Main : Form

    {

        publicMain()

        {

            InitializeComponent(); 

        }

       private BarCodeClass bcc = newBarCodeClass();

       private DocementBase _docement;

        //生成條形碼

        privatevoid button1_Click(objectsender,EventArgs e)

        {

            bcc.CreateBarCode(pictureBox1,txtMsg.Text);

        }

        //生成二維碼

        privatevoid button2_Click(objectsender,EventArgs e)

        {

            bcc.CreateQuickMark(pictureBox1, txtMsg.Text);

        }

        privatevoid Form1_Load(objectsender,EventArgs e)

        {

            txtMsg.Text = System.DateTime.Now.ToString("yyyyMMddhhmmss").Substring(0,12);

        }

        //解碼

        privatevoid button4_Click(objectsender,EventArgs e)

        {

            if(pictureBox1.Image ==null)

            {

                MessageBox.Show("請錄入影象後再進行解碼!");

                return;

            }

            BarcodeReaderreader =new BarcodeReader(); 

            Resultresult = reader.Decode((Bitmap)pictureBox1.Image);

            MessageBox.Show(result.Text);

        }

        //列印

        privatevoid button3_Click(objectsender,EventArgs e)

        {

            if(pictureBox1.Image ==null)

            {

                MessageBox.Show("You Must Load an Image first!");

                return;

            }

            else

            {

                _docement=new imageDocument(pictureBox1.Image);

            }

          _docement.showPrintPreviewDialog();

        }

    }

}

Step7:剩下的就是演示了:本機演示結果如下:

》執行程式:點選【生成條形碼】,結果如下:

》點選【解碼】按鈕,結果如下:

》點選《列印》按鈕,結果如下:

》點選【生成二維碼】按鈕,結果如下:

》點選【解碼】按鈕,結果如下:


》點選【列印】按鈕,結果如下: