SOUI基于Zint生成EAN码

devtools/2025/3/7 1:56:13/

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然后在处理;


http://www.ppmy.cn/devtools/165125.html

相关文章

Android动态适配中英文开发指南

Android动态适配中英文开发。首先&#xff0c;我需要确定用户的需求到底是什么。可能他们正在开发一个需要支持中英文的Android应用&#xff0c;想要知道如何动态切换语言&#xff0c;而不仅仅是依赖系统默认语言。或者他们可能遇到了在应用内切换语言时的一些问题&#xff0c;…

将JSON格式数据转化为sql 插入语句

import json# 从 txt 文件中读取 JSON 数据 def read_json_from_file(file_path):with open(file_path, r, encodingutf-8) as file:return file.read()# 将 SQL 语句写入到 txt 文件中 def write_sql_to_file(output_file_path, sql_statements):with open(output_file_path, …

AI面板识别 - 华为OD统一考试(java)

题目描述 AI识别到面板上有N&#xff08;1 ≤ N ≤ 100&#xff09;个指示灯&#xff0c;灯大小一样&#xff0c;任意两个之间无重叠。 由于AI识别误差&#xff0c;每次别到的指示灯位置可能有差异&#xff0c;以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1&#x…

React Native 原理

React Native 是一个跨平台移动应用开发框架&#xff0c;它允许开发者使用 JavaScript 和 React 来开发 iOS 和 Android 原生应用。React Native 的核心原理是通过 桥接&#xff08;Bridge&#xff09; 技术&#xff0c;使用 JavaScript 来控制原生组件&#xff0c;并将应用逻辑…

本周四19点,《基于深度学习的计算音乐学》开讲!

《2025GAS声学大讲堂—音频产业创新技术公益讲座》声音与音乐技术系列专题讲座第2讲将于3月6日周四19点开讲&#xff0c;本次邀请了 复旦大学 博士生 茹港徽 演讲&#xff0c;讲座主题&#xff1a;《基于深度学习的计算音乐学》。此次直播方式为中国电子音响行业协会视频号和小…

C++程序设计语言标准库:STL概述

一、前言 本专题是作者为了加强C与数据结构的学习而作的记录&#xff0c;我所使用的STL版本为SGI STL&#xff0c;这里引用侯杰的《STL源码刨析》中的序言&#xff1a; STL&#xff0c;虽然是一套程序库&#xff08;library&#xff09;&#xff0c;却不只是一般印象中的程序库…

AI情感的产生:从大数据堆砌到“类人情感”的进化

人类情感的形成是一个复杂的过程&#xff0c;它源于无数次的互动、记忆和反馈。正如一个孩子通过母亲的照顾、陪伴和关爱逐渐形成对“妈妈”的情感依赖&#xff0c;这种情感本质上是基于大量数据的积累和模式识别。而人工智能&#xff08;AI&#xff09;作为大数据的产物&#…

rust笔记12:rust的泛型

Rust 的泛型实现是其类型系统的核心特性之一,它允许编写灵活且可重用的代码,同时保持类型安全和性能。以下从 泛型数据类型、泛型类型参数、trait bound 和 生命周期泛型 四个方面详细介绍 Rust 的泛型实现,并解释编译器如何通过 静态分发 处理泛型。 1. 泛型数据类型 泛型…