Ean13.cs

<< Click to Display Table of Contents >>

Navigation:  Outros > Código de Barras >

Ean13.cs

Previous pageReturn to chapter overviewNext page

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Text;

 

namespace Ean13Barcode2005

{

    public class Ean13

    {

        private string _sName = "EAN13";

 

        private float _fMinimumAllowableScale = .8f;

        private float _fMaximumAllowableScale = 2.0f;

 

        // Este é o tamanho nominal recomendado pela EAN.

        private float _fWidth = 37.29f;

        private float _fHeight = 25.93f;

        private float _fFontSize = 8.0f;

        private float _fScale = 1.0f;

 

        // Dígitos mão esquersa

        private string[] _aOddLeft = { "0001101""0011001""0010011""0111101""0100011""0110001""0101111""0111011""0110111""0001011" };

        private string[] _aEvenLeft = { "0100111""0110011""0011011""0100001""0011101""0111001""0000101""0010001""0001001""0010111" };

 

        // Dígitos mão direita

        private string[] _aRight = { "1110010""1100110""1101100""1000010""1011100""1001110""1010000""1000100""1001000""1110100" };

        private string _sQuiteZone = "000000000";

        private string _sLeadTail = "101";

        private string _sSeparator = "01010";

        private string _sProductCode;

        private string _sChecksumDigit;

 

        public Ean13()

        {

        }

 

        public Ean13(string productId)

        {

            this.ProductCode = productId;

            this.CalculateChecksumDigit();

        }

 

        public Ean13(string productId, string checkDigit)

        {

            this.ProductCode = productId;

            this.ChecksumDigit = checkDigit;

        }

 

        public void DrawEan13Barcode(Graphics g, Point pt)

        {

            float width = this.Width * this.Scale;

            float height = (this.Height / 2) * this.Scale;

 

            //        EAN13 Barcode should be a total of 113 modules wide.

            float lineWidth = width / 113f;

 

            // Save the GraphicsState.

            GraphicsState gs = g.Save();

 

            // Set the PageUnit to Inch because all of our measurements are in inches.

            g.PageUnit = GraphicsUnit.Millimeter;

 

            // Set the PageScale to 1, so a millimeter will represent a true millimeter.

            g.PageScale = 1;

 

            // cor amarela no fundo para testar a área do código

            // g.FillRectangle(new SolidBrush(Color.Yellow), 0, 0, 100, 100);

 

            SolidBrush brush = new SolidBrush(Color.Black);

 

            float xPosition = 0;

 

            System.Text.StringBuilder strbEAN13 = new System.Text.StringBuilder();

            System.Text.StringBuilder sbTemp = new System.Text.StringBuilder();

 

            float xStart = pt.X;

            float yStart = pt.Y;

            float xEnd = 0;

 

            Font font = new Font("Arial"this._fFontSize * this.Scale);

 

            // Calculate the Check Digit.

            this.CalculateChecksumDigit();

 

            string sTemp = String.Format("{0}{1}"this.ProductCode, this.ChecksumDigit);

            string sLeftPattern = "";

 

            // Convert the left hand numbers.

            sLeftPattern = ConvertLeftPattern(sTemp.Substring(0, 7));

 

            // Build the UPC Code.

            strbEAN13.AppendFormat("{0}{1}{2}{3}{4}{1}{0}"this._sQuiteZone, this._sLeadTail, sLeftPattern, this._sSeparator, ConvertToDigitPatterns(sTemp.Substring(7), this._aRight));

 

            string sTempUPC = strbEAN13.ToString();

            float fTextHeight = g.MeasureString(sTempUPC, font).Height;

 

 

            // Draw the barcode lines.

            for (int i = 0; i < strbEAN13.Length; i++)

            {

                if (sTempUPC.Substring(i, 1) == "1")

                {

                    if (xStart == pt.X)

                        xStart = xPosition;

 

                    // Save room for the UPC number below the bar code.

                    //if ((i > 12 && i < 55) || (i > 57 && i < 101))

                    // Draw space for the number

                    g.FillRectangle(brush, xPosition, yStart, lineWidth, height - fTextHeight);

                    //else

                    // Draw a full line.

                    //        g.FillRectangle(brush, xPosition, yStart, lineWidth, height);

                }

 

                xPosition += lineWidth;

                xEnd = xPosition;

            }

 

            /*

            // Draw the upc numbers below the line.

            xPosition = xStart - g.MeasureString(this.ProductCode.Substring(0, 1), font).Width;

            float yPosition = yStart + (height - fTextHeight);

 

            // Draw 1st digit of the country code.

            g.DrawString(sTemp.Substring(0, 1), font, brush, new PointF(xPosition, yPosition));

 

            xPosition += (g.MeasureString(sTemp.Substring(0, 1), font).Width + 43 * lineWidth) -

                (g.MeasureString(sTemp.Substring(1, 6), font).Width);

 

            // Draw MFG Number.

            g.DrawString(sTemp.Substring(1, 6), font, brush, new PointF(xPosition, yPosition));

 

            xPosition += g.MeasureString(sTemp.Substring(1, 6), font).Width + (11 * lineWidth);

 

            // Draw Product ID.

            g.DrawString(sTemp.Substring(7), font, brush, new PointF(xPosition, yPosition));

            */

            // Restore the GraphicsState.

            g.Restore(gs);

        }

 

 

        public Bitmap CreateBitmap()

        {

            float tempWidth = 115; // (this.Width * this.Scale) * 100;

            float tempHeight = 35; // (this.Height * this.Scale) * 100;

 

            Bitmap bmp = new Bitmap((int)tempWidth, (int)tempHeight);

 

            Graphics g = Graphics.FromImage(bmp);

            this.DrawEan13Barcode(g, new Point(0, 0));

            g.Dispose();

            return bmp;

        }

 

 

        private string ConvertLeftPattern(string sLeft)

        {

            switch (sLeft.Substring(0, 1))

            {

                case "0":

                    return CountryCode0(sLeft.Substring(1));

 

                case "1":

                    return CountryCode1(sLeft.Substring(1));

 

                case "2":

                    return CountryCode2(sLeft.Substring(1));

 

                case "3":

                    return CountryCode3(sLeft.Substring(1));

 

                case "4":

                    return CountryCode4(sLeft.Substring(1));

 

                case "5":

                    return CountryCode5(sLeft.Substring(1));

 

                case "6":

                    return CountryCode6(sLeft.Substring(1));

 

                case "7":

                    return CountryCode7(sLeft.Substring(1));

 

                case "8":

                    return CountryCode8(sLeft.Substring(1));

 

                case "9":

                    return CountryCode9(sLeft.Substring(1));

 

                default:

                    return "";

            }

        }

 

 

        private string CountryCode0(string sLeft)

        {

            // 0 Odd Odd  Odd  Odd  Odd  Odd 

            return ConvertToDigitPatterns(sLeft, this._aOddLeft);

        }

 

 

        private string CountryCode1(string sLeft)

        {

            // 1 Odd Odd  Even Odd  Even Even 

            System.Text.StringBuilder sReturn = new StringBuilder();

            // The two lines below could be replaced with this:

            // sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 0, 2 ), this._aOddLeft ) );

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aOddLeft));

            // The two lines below could be replaced with this:

            // sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 4, 2 ), this._aEvenLeft ) );

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aEvenLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode2(string sLeft)

        {

            // 2 Odd Odd  Even Even Odd  Even 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aEvenLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode3(string sLeft)

        {

            // 3 Odd Odd  Even Even Even Odd 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aOddLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode4(string sLeft)

        {

            // 4 Odd Even Odd  Odd  Even Even 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aEvenLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode5(string sLeft)

        {

            // 5 Odd Even Even Odd  Odd  Even 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aEvenLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode6(string sLeft)

        {

            // 6 Odd Even Even Even Odd  Odd 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aOddLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode7(string sLeft)

        {

            // 7 Odd Even Odd  Even Odd  Even

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aEvenLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode8(string sLeft)

        {

            // 8 Odd Even Odd  Even Even Odd 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aOddLeft));

            return sReturn.ToString();

        }

 

 

        private string CountryCode9(string sLeft)

        {

            // 9 Odd Even Even Odd  Even Odd 

            System.Text.StringBuilder sReturn = new StringBuilder();

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(0, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(1, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(2, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(3, 1), this._aOddLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(4, 1), this._aEvenLeft));

            sReturn.Append(ConvertToDigitPatterns(sLeft.Substring(5, 1), this._aOddLeft));

            return sReturn.ToString();

        }

 

 

        private string ConvertToDigitPatterns(string inputNumber, string[] patterns)

        {

            System.Text.StringBuilder sbTemp = new StringBuilder();

            int iIndex = 0;

            for (int i = 0; i < inputNumber.Length; i++)

            {

                iIndex = Convert.ToInt32(inputNumber.Substring(i, 1));

                sbTemp.Append(patterns[iIndex]);

            }

            return sbTemp.ToString();

        }

 

 

        public void CalculateChecksumDigit()

        {

            string sTemp = this.ProductCode;

            int iSum = 0;

            int iDigit = 0;

 

            // Calculate the checksum digit here.

            for (int i = sTemp.Length; i >= 1; i--)

            {

                iDigit = Convert.ToInt32(sTemp.Substring(i - 1, 1));

                if (i % 2 == 0)

                {        // odd

                    iSum += iDigit * 3;

                }

                else

                {        // even

                    iSum += iDigit * 1;

                }

            }

 

            int iCheckSum = (10 - (iSum % 10)) % 10;

            this.ChecksumDigit = iCheckSum.ToString();

 

        }

 

        #region -- Attributes/Properties --

 

        public string Name

        {

            get

            {

                return _sName;

            }

        }

 

        public float MinimumAllowableScale

        {

            get

            {

                return _fMinimumAllowableScale;

            }

        }

 

        public float MaximumAllowableScale

        {

            get

            {

                return _fMaximumAllowableScale;

            }

        }

 

        public float Width

        {

            get

            {

                return _fWidth;

            }

        }

 

        public float Height

        {

            get

            {

                return _fHeight;

            }

        }

 

        public float FontSize

        {

            get

            {

                return _fFontSize;

            }

        }

 

        public float Scale

        {

            get

            {

                return _fScale;

            }

 

            set

            {

                if (value < this._fMinimumAllowableScale || value > this._fMaximumAllowableScale)

                    throw new Exception("Escala do fator fora do intervalo permitido.  Valores devem estar entre " +

                        this._fMinimumAllowableScale.ToString() + " e " +

                        this._fMaximumAllowableScale.ToString());

                _fScale = value;

            }

        }

 

        public string ProductCode

        {

            get

            {

                return _sProductCode;

            }

 

            set

            {

                _sProductCode = value;

            }

        }

 

        public string ChecksumDigit

        {

            get

            {

                return _sChecksumDigit;

            }

 

            set

            {

                int iValue = Convert.ToInt32(value);

                if (iValue < 0 || iValue > 9)

                    throw new Exception("O digito verificador deve estar entre 0 e 9.");

                _sChecksumDigit = value;

            }

        }

        #endregion -- Attributes/Properties --

    }

}