SOUI基于Zint生成EAN码

打印 上一主题 下一主题

主题 1046|帖子 1046|积分 3138

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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码生成相干的代码:
  1. std::string strContent = "1234567";
  2. CRect rcCode(0,0,200,50);
  3. struct zint_symbol* symbol;
  4. symbol = ZBarcode_Create();
  5. symbol->symbology = BARCODE_EANX;  //BARCODE_EANX_CHK
  6. symbol->input_mode = DATA_MODE; //数据编码格式
  7. int nRet = ZBarcode_Encode_and_Buffer_Vector(symbol, (unsigned char*)strContent.c_str(), strContent.size(), 0);
  8. if (nRet == 0)
  9. {
  10.     ZBarcode_Print(symbol, 0);
  11.     //拿到绘制的所有黑色条
  12.     int nMinLen = 500;
  13.     int nMaxLen = 0;
  14.    
  15.     std::vector<CRect> vecBlackRect;
  16.     if (symbol->vector)
  17.     {
  18.         struct zint_vector_rect* rect = symbol->vector->rectangles;
  19.         while (rect)
  20.         {
  21.             CRect rcTmp;
  22.             rcTmp.left = rect->x;
  23.             rcTmp.top = rect->y;
  24.             rcTmp.right = rcTmp.left + rect->width;
  25.             rcTmp.bottom = rcTmp.top + rect->height;
  26.             vecBlackRect.push_back(rcTmp);
  27.             
  28.             if (rect->height > nMaxLen) nMaxLen = rect->height;
  29.             if (rect->height < nMinLen) nMinLen = rect->height;
  30.             
  31.             rect = rect->next;
  32.         }
  33.     }
  34.     //计算在rcCode中绘制每个单位的宽跟标准的宽,主要绘制的时间用
  35.     double nDrawUint = (double)rcCode.Width() / symbol->width;
  36.     double nUint = (double)symbol->bitmap_width / symbol->width;
  37.    
  38.     std::vector<CRect> vecDrawBlack;  //绘制条码条的真实区域
  39.     for (int i = 0; i < vecBlackRect.size(); i++)
  40.     {
  41.         //分出那些是绘制长条,那些绘制短条
  42.         CRect rcTmp(vecBlackRect[i]);
  43.         rcTmp.left = rcTmp.left / nUint * nDrawUint;
  44.         rcTmp.right = rcTmp.right / nUint * nDrawUint;
  45.         if (rcTmp.Height() == nMaxLen)
  46.         {
  47.             //长条  
  48.             //实际绘制的rc的top跟bottom即为rcCode的top跟bottom   
  49.         }
  50.         else
  51.         {
  52.             //短条
  53.             //此处如果要区分文本位置则需要特殊处理
  54.             //如果文本在上边则绘制的rc的top为rcCode的top加上文本高度或者自定义的一个高度。rc的bottom为rcCode的bottom
  55.             //如果文本在下边则绘制的rc的top为rcCode的top。rc的bottom为rcCode的bottom减去文本高度或者自定义的一个高度      
  56.         }            
  57.     }
  58.    
  59.     //拿到计算出的真实绘制区域然后再进行单个绘制或者以路径的方式绘制
  60.     //TODO:
  61.         
  62.     //文本的绘制
  63.     //EAN-8码的文本分成了2部分,在绘制时分别绘制即可
  64.     //TODO:
  65. }
复制代码
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然后在处置惩罚;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表