IV. TÌM HIỂU VỀ MÃ VẠCH
5. Cách tạo ra mã vạch EAN-13
Bắt đầu
Nhập mã quốc gia Nhập mã nhà sản xuất
Nhập mã hàng hóa
Kiểm tra Báo lỗi
Tính tổng tạo ra số thứ 13
Kiểm tra Xác định số đầu tiên
trong dãy số Dựa mã quốc gia xác định tính chẳn, lẻ
Hàm chuyển mã hàng hóa thành chuổi đồ họa
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 18
- Các hàm sử dụng trong quy trình
False
True
True False
True
- Đầu tiên tạo Class EAN-13 bao gồm:
+ Tạo một số biến quan trọng cần sử dụng trong Class:
Begin Input CountryCode Input ManufacturerCode Check Error CalculateChecksumDigit Check ConvertLeftPattern CountryCode ConvertToDigitPatterns DrawEan13Barcode Finish
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 19
Các _fWidth, _fHeight, _fFontSize,_fSacle làbiến được khởi tạo với kích thước chiều cao, chiều rộng, kiểu chữ, kích cỡ mã vạch.
Các biến _aOddLeft, _aEvenLeft, _aRight, _sQuiteZone là tất cả các cơ quan đại diện của chuỗi đồ họa / không gian, đại diện cho các phần khác nhau của một mã vạch EAN-13. Về cơ bản, "1" đại diện cho một đường đen và một '0' đại diện cho một không gian. Một phương pháp thay thếđể sử dụng một chuỗi có thểđược sử dụng một biểu diễn nhị phân, nơi một bit 0 sẽ là một không gian và một bít 1 là một vạch đen. _sLeadTail đại diện cho vạch biên và _sSeparator đại diện cho vạch giữa.
// Khởi tạo một số biến cần dùng
privatefloat _fWidth = 29.29f;
privatefloat _fHeight = 8.93f;
privatefloat _fFontSize = 6.0f;
privatefloat _fScale = 1.0f;
privatestring[] _aOddLeft = { "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011","0110111", "0001011" };
privatestring[] _aEvenLeft = { "0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001","0001001", "0010111" };
privatestring[] _aRight = { "1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100","1001000", "1110100" };
privatestring _sQuiteZone = "000000000";
privatestring _sLeadTail = "101";
privatestring _sSeparator = "01010";
privatestring _sCountryCode = "00";
privatestring _sManufacturerCode;
privatestring _sProductCode;
privatestring _sChecksumDigit;
+ Viết hàm vẽ mã vạch EAN-13 lên trên picturebox trong winform:
Bước đầu tiên cho chức năng DrawEan13 là tạo ra một thể hiện của lớp Ean13, và sau đó thiết lập các mã quốc gia, mã nhà sản xuất, mã sản phẩm, và mã kiểm tra (được tính ở hàm CalculateChecksumDigit). Một khi các thuộc tính được thiết lập, khi thao tác được thực hiện thì tác động chức năng DrawEan13Barcode được thực hiện, thông qua một đối tượng đồ họa và một điểm, mà chỉ ra vị trí bắt đầu để vẽ, điều này sẽ tạo ra các mã vạch được rút ra trong hộp hình ảnh bắt đầu từđiểm (0, 0).
privatevoid DrawEan13( ) {
System.Drawing.Graphics g = this.picBarcode.CreateGraphics( );
g.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.SystemColors.Control), new Rectangle(0, 0, picBarcode.Width, picBarcode.Height));
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 20
upc = new Ean13( ); upc.CountryCode = " "; upc.ManufacturerCode = " "; upc.ProductCode = " ";
upc.Scale = (float)Convert.ToDecimal(cboScale.Items [cboScale.SelectedIndex]); upc.DrawEan13Barcode( g, new System.Drawing.Point( 0, 0 ) ;
g.Dispose( ); }
+ Viết hàm tạo ta số kiểm tra số cuối cùng (ChecksumDigit)
Chức năng đầu tiên DrawEan13Barcode gọi hàm CalculateChecksumDigit,
trong đó sử dụng mã quốc gia, mã nhà sản xuất, và mã sản phẩm để tính toán kiểm tra tổng hợp của mã vạch.
publicvoid CalculateChecksumDigit( ) {
// cộng các mã số của mã quốc gia, nhà sản xuất, mã sản phẩm
string sTemp = this.CountryCode + this.ManufacturerCode + this.ProductCode; int iSum = 0;
int iDigit = 0
for( int i = sTemp.Length; i >= 1; i-- ) {
iDigit = Convert.ToInt32( sTemp.Substring( i - 1, 1 ) )
// chuyển sang kiểu số if( i % 2 == 0 ) // nếu là số chẳn nhân cho 3 { iSum += iDigit * 3; } else { iSum += iDigit * 1; } }
int iCheckSum = ( 10 - ( iSum % 10 ) ) % 10; this.ChecksumDigit = iCheckSum.ToString( ); }
+ Viết hàm chuyển các số cá nhân của nhà sản xuất, mã sản phẩm thành chuổi đại diện của đồ họa mã vạch.
Tiếp đến ta sử dụng hàm ConvertToDigitPattern chức năng này có số cá nhân của mã quốc gia, mã nhà sản xuất, và mã sản phẩm, chuyển đổi chúng thành các chuỗi mã nhị phân đại diện của đồ họa mã vạch (được xác định trong bảng Chuyển đổi giá
trị số sang mã nhị phân).
privatestring ConvertToDigitPatterns(string inputNumber, string [] patterns) {
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 21
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( ); }
+ Hàm ConvertToDigitPatterns chức năng yêu cầu hai thông số:
• inputNumber
• patterns
Các inputNumber sẽ là một trong hai số nhà sản xuất, hoặc mã sản phẩm, và các mô hình sẽ là_aOddLeft, _aEvenLeft, hoặc mảng _aRight tùy thuộc vào việc inputNumber là số nhà sản xuất hoặc mã sản phẩm.
Các ConvertLeftPatterns được sử dụng để tạo ra các mô hình được xem xét trong bảng xác định số chẵn lẻ. Các ConvertLeftPatterns xác định mã quốc gia, và dựa và mã quốc gia để xác định tính chẳn lẻ của sáu số tiếp theo các thao tác chuyển
đổi mã quốc gia thích hợp.
privatestring 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":
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 22
case "7":
return CountryCode7( sLeft.Substring( 1 ) ); case "8":
return CountryCode8( sLeft.Substring( 1 ) ); case "9":
return CountryCode9( sLeft.Substring( 1 ) ); default:
return ""; }
}
Mỗi mã quốc gia có chức năng chuyển đổi riêng biệt của nó. CountryCode0 là một mã vạch UPC-A do đó, nó sẽ chỉ sử dụng các mô hình lẻ chẵn lẻ trong bảng xác
định số chẳn lẻ. CountryCode1 qua CountryCode9 từng sử dụng các mô hình cân bằng thích hợp được xét trong phần xác định số chẵn lẻ.
privatestring CountryCode1( string sLeft ) {
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._aOddLeft ) ); sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 4, 1 ), this._aEvenLeft ) ); sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 5, 1 ), this._aEvenLeft ) ); return sReturn.ToString( );
}
+ Cuối cùng viết hàm DrawEan13Barcode tạo mã vạch kèm theo mã sản phẩm, tên sản phẩm, đơn giá.
Các chức năng sử dụng các chức năng CalculateChecksumDigit để tính toán số
kiểm tra tổng hợp chính xác, hàm ConvertLeftPatterns được thực hiện, và sau đó là chức năng ConvertToDigitPatterns được sử dụng để chuyển đổi mã sản phẩm và kiểm tra số tổng của các số mã vạch EAN-13 thành một chuỗi.
Khi mã hàng hóa đã được chuyển đổi sang một chuỗi đại diện, các mã sử dụng chuỗi đại diện để làm cho mã vạch, 1 sẽ tạo ra những vạch mà đen, và 0 sẽ tạo ra các không gian trống của hình. Nếu mã vẽ một hình chữ nhật, nó cũng sẽđưa vào xem xét
để điều chỉnh hình chữ nhật để cho phép không gian cho số của nhà sản xuất và mã sản phẩm. Một khi mã vạch đầu tiên được tạo ra, các mã sau đó xác định vị trí và tiếp tục tạo ra.
publicvoid DrawEan13Barcode(System.Drawing.Graphics g, System.Drawing.Point pt) {
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 23
float width = this.Width * this.Scale; float height = this.Height * this.Scale; float lineWidth = width / 113f;
System.Drawing.Drawing2D.GraphicsState gs = g.Save(); g.PageUnit = System.Drawing.GraphicsUnit.Millimeter; g.PageScale = 1;
System.Drawing.SolidBrush brush = new
System.Drawing.SolidBrush(System.Drawing.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;
System.Drawing.Font font = new System.Drawing.Font("Arial", this._fFontSize *
this.Scale); // Tính chữ số thứ 13 this.CalculateChecksumDigit(); sbTemp.AppendFormat("{0}{1}{2}{3}", this.CountryCode, this.ManufacturerCode, this.ProductCode, this.ChecksumDigit);
string sTemp = sbTemp.ToString(); string sLeftPattern = " "
sLeftPattern = ConvertLeftPattern(sTemp.Substring(0, 7)); 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;
// vẽ các đường của mã vạch
for (int i = 0; i < strbEAN13.Length; i++) { if (sTempUPC.Substring(i, 1) == "1") { if (xStart == pt.X) xStart = xPosition+15; // Lưu các mã sản phẩm dưới mã vạch
if ((i > 12 && i < 55) || (i > 57 && i < 101))
g.FillRectangle(brush, xPosition+15, yStart, lineWidth, height ,fTextHeight) els
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 24
g.FillRectangle(brush, xPosition+15, yStart, lineWidth, height); }
xPosition += lineWidth; xEnd = xPosition;
//Vẽđầy đủ các số dưới mã vạch
xPosition = xStart- g.MeasureString(this.CountryCode.Substring(0, 1), font).Width; float yPosition = yStart +(height - fTextHeight);
// Vẽ chữ số của mã quốc gia
g.DrawString(sTemp.Substring(0, 1), font, brush, new
System.Drawing.PointF(xPosition, yPosition));
xPosition += (g.MeasureString(sTemp.Substring(0, 1), font).Width + 43 * lineWidth) (g.MeasureString(sTemp.Substring(1, 6), font).Width);
g.DrawString(sTemp.Substring(1, 6), font, brush, new
System.Drawing.PointF(xPosition, yPosition));
xPosition += g.MeasureString(sTemp.Substring(1, 6), font).Width + (11 * lineWidth);
// Vẽ chữ số của mã nhà sản xuất
g.DrawString(sTemp.Substring(7), font, brush, new
System.Drawing.PointF(xPosition, yPosition));
// Vẽ tên của hàng hóa
float xPosition1 = (xStart+3) - g.MeasureString(this.CountryCode.Substring(0, 1), font).Width;
float yPosition1 = yStart - 3;
g.DrawString(bien._tenH.Substring(0), font, brush, new
System.Drawing.PointF(xPosition1, yPosition1));
xPosition1 += (g.MeasureString(bien._tenH.Substring(0), font).Width + 1 * lineWidth) - (g.MeasureString(bien._tenH.Substring(0), font).Width);
// Vẽ giá của mặt hàng
float xPosition2 = xStart +1 + g.MeasureString(this.CountryCode.Substring(0, 1), font).Width;
float yPosition2 = yStart + 10;
g.DrawString(bien._ten.Substring(0), font, brush, new
System.Drawing.PointF(xPosition2, yPosition2));
xPosition2 += g.MeasureString(bien._ten.Substring(0), font).Width + (1 * lineWidth) - (g.MeasureString(bien._ten.Substring(0), font).Width); ;
float xPosition3 = xStart +6 + g.MeasureString(this.CountryCode.Substring(0, 1), font).Width;
float yPosition3 = yStart + 10;
g.DrawString(bien._gia.Substring(0), font, brush, new
System.Drawing.PointF(xPosition3, yPosition3));
xPosition3 += (g.MeasureString(bien._gia.Substring(0), font).Width + 1 * lineWidth) - (g.MeasureString(bien._gia.Substring(0), font).Width);
H th ng qu n lý siêu th mini b ng mã v ch
GVHD: Nguyễn Thái Nghe 25
float yPosition4 = yStart + 10;
g.DrawString(bien._dong.Substring(0), font, brush, new
System.Drawing.PointF(xPosition4, yPosition4)); g.Restore(gs);
}