|
<< Click to Display Table of Contents >> Ean13.cs |
![]() ![]()
|
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 --
}
}