EAN碼廣泛應用與歐洲的零售業。包括EAN-2、EAN-5、EAN-8和EAN-12碼。分別編碼 2、5、7 或 12 位數字。此外,可以使用 + 字符將 EAN-2 和 EAN-5 附加符號添加到 EAN-8 和 EAN-13 符號中,就像 UPC 符號一樣。
EAN-8校驗碼計算:
- 從左往右奇數位的數相加乘以3得出C1
- 偶數位的數相加得出C2
- C1+C2得出CC
- 找到比CC大的最小10的倍數為CX
- CX-CC的值即為校驗碼
EAN-13校驗碼計算跟EAN-8計算規則一樣。
例如:7432365
C1 = (5+3+3+7)*3; C1=54;
C2 =6+2+4; C2=12;
CC=C1+C2; CC=66;
CC=70;
校驗碼即為CX-CC; 70-66=4;
EAN碼默認生成校驗碼文檔中是這樣描述的:
All of the EAN symbols include check digits which are added by Zint. If you are encoding an EAN-8 or EAN-13 symbol and your data already includes the check digit then you can use symbology BARCODE_EANX_CHK (14) which takes an 8 or 13-digit input and validates the check digit before encoding
下邊我們一起來看看EAN-8跟EAN-13碼生成相關的代碼:
std::string strContent = "1234567";
CRect rcCode(0,0,200,50);struct zint_symbol* symbol;
symbol = ZBarcode_Create();
symbol->symbology = BARCODE_EANX; //BARCODE_EANX_CHK
symbol->input_mode = DATA_MODE; //數據編碼格式
int nRet = ZBarcode_Encode_and_Buffer_Vector(symbol, (unsigned char*)strContent.c_str(), strContent.size(), 0);
if (nRet == 0)
{ZBarcode_Print(symbol, 0);//拿到繪制的所有黑色條int nMinLen = 500;int nMaxLen = 0;std::vector<CRect> vecBlackRect;if (symbol->vector){struct zint_vector_rect* rect = symbol->vector->rectangles;while (rect){CRect rcTmp;rcTmp.left = rect->x;rcTmp.top = rect->y;rcTmp.right = rcTmp.left + rect->width;rcTmp.bottom = rcTmp.top + rect->height;vecBlackRect.push_back(rcTmp);if (rect->height > nMaxLen) nMaxLen = rect->height;if (rect->height < nMinLen) nMinLen = rect->height;rect = rect->next;}}//計算在rcCode中繪制每個單位的寬跟標準的寬,主要繪制的時間用double nDrawUint = (double)rcCode.Width() / symbol->width;double nUint = (double)symbol->bitmap_width / symbol->width;std::vector<CRect> vecDrawBlack; //繪制條碼條的真實區域for (int i = 0; i < vecBlackRect.size(); i++){//分出那些是繪制長條,那些繪制短條CRect rcTmp(vecBlackRect[i]);rcTmp.left = rcTmp.left / nUint * nDrawUint;rcTmp.right = rcTmp.right / nUint * nDrawUint;if (rcTmp.Height() == nMaxLen){//長條 //實際繪制的rc的top跟bottom即為rcCode的top跟bottom }else{//短條//此處如果要區分文本位置則需要特殊處理//如果文本在上邊則繪制的rc的top為rcCode的top加上文本高度或者自定義的一個高度。rc的bottom為rcCode的bottom//如果文本在下邊則繪制的rc的top為rcCode的top。rc的bottom為rcCode的bottom減去文本高度或者自定義的一個高度 } }//拿到計算出的真實繪制區域然后再進行單個繪制或者以路徑的方式繪制//TODO://文本的繪制//EAN-8碼的文本分成了2部分,在繪制時分別繪制即可//TODO:
}
EAN-13碼的繪制基本與EAN-8相同,也是分出長短條再分別繪制。不同的地方在于再繪制EAN-13碼時文本時分成3部分的(參考UPC-E碼)。
對于EAN-2、EAN-5碼以及組合碼都可做相似的處理。
EAN-2、EAN-5碼可作為EAN-8、EAN-13碼的補充碼出現。
比如:1234567+12(EAN8+EAN2)該數據在生成時是會生成一個EAN-8碼跟EAN-2碼在繪制時分開繪制即可。
另外在實際使用中如果傳入的數據匹配不到對應的位數Zint會通過在數據前邊添加0的方式來處理。
比如:傳入1,位數達不到兩位Zint會自動補個0使數據變為01然后再按EAN-2碼格式編碼;
傳入123456,位數不夠七位會自動補全成0123456然后再處理;
對于組合碼也同樣:123456+1位數不夠,會自動補全成0123456+01然后在處理;