SOUI基于Zint生成Code 39码

在Zint中BARCODE_CODE39、BARCODE_EXCODE39是 Code 3 of 9(Code 39)条形码的不同变体。

BARCODE_CODE39码:标准39码

  • 字符集:支持44个字符,包括数字(0-9)、大写字母(A-Z)和7个特殊字符(-、.、空格、$、/、+、%)。
  • 结构:每个字符由9个元素组成,包含5条和4空,其中3条是宽的,其他元素是窄的。起始和终止字符为“*”。
  • 应用:广泛应用于物流、制造、医疗和资产管理等领域,适合编码长度较短的字符串。
    标准的39码不需要校验码,但是如果需要的话可通过设置option_2的值添加modulo-43校验码。
    文档中如是说:
    The standard does not require a check digit but a modulo-43 check digit can be added if desired by setting --vers=1 (API option_2 = 1). To add a check digit but not show it in the Human Readable Text, set --vers=2 (API option_2 = 2).
    校验码计算规则:Code 39 支持可选的 Modulo 43 校验位,用于提高数据准确性。
  • 为每个字符分配一个权重值(0 到 42)。
  • 将所有字符的权重值相加,得到总和。
  • 校验位是总和对 43 取模的结果,对应的字符即为校验位。
//字符权重对照
0-9: 0-9
A-Z: 10-35
-: 36
.: 37
空格: 38
$: 39
/: 40
+: 41
%: 42

BARCODE_EXCODE39码:扩展39码

  • 字符集:支持128个ASCII字符,包括标准Code 39支持的44个字符以及其他字符。它通过将标准Code 39字符组合的方式来表示额外的字符,例如小写字母和控制字符。
  • 结构:与标准Code 39相同,依然使用9个元素(5条和4空)来表示一个字符。
  • 应用:适用于需要编码更多字符的应用场景,如包括小写字母、特殊字符和控制字符的字符串。
    Extended Code 39码不需要校验码,但是如果需要的话可通过设置option_2的值添加modulo-43校验码。
    校验码计算规则:扩展39码支持所有的ASCII码,校验码计算方法跟标准39码一样。权重值为各字符的ASCII码值。

标准Code 39适用于编码长度较短且不需要复杂字符的字符串,Extended Code 39适用于需要编码更多字符和更复杂字符串的场景。

以下即为生成代码:

struct zint_symbol* symbol;
symbol = ZBarcode_Create();
symbol->symbology = BARCODE_CODE39;   //码制
symbol->input_mode = DATA_MODE; //数据编码格式
//symbol->option_2 = 1;   //1 校验

std::string strContent = "123456";
CRect rcCode(0,0,200,50);
int nRet = ZBarcode_Encode_and_Buffer_Vector(symbol, (unsigned char*)strContent.c_str(), strContent.size(), 0);
if (nRet == 0)
{
    //success
    ZBarcode_Print(symbol, 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);
            rect = rect->next;        
        }    
    }
    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;
        rcTmp.bottom = rcTmp.top + rcCode.Height();
        vecDrawBlack.push_back(rcTmp);   
    }
    
    //绘制条码
    //可选择是否绘制条码背景色
    {
        COLORREF clrBkgnd = GETCOLOR(L"RGB(255,255,255)");
        CAutoRefPtr<IBrush> brush, oldbrush;
        pRT->CreateSolidColorBrush(clrBkgnd, &brush);
        pRT->SelectObject(brush, (IRenderObj**)&oldbrush);
        pRT->FillRectangle(&rcCode);
        pRT->SelectObject(oldbrush, NULL);    
    }
    CAutoRefPtr<IPath> path;
    GETRENDERFACTORY->CreatePath(&path);
    for (int i = 0; i < vecDrawBlack.size(); i++)
    {
        CRect rcBlack;
        rcBlack.left += vecDrawBlack[i].left + rcCode.left;
        rcBlack.top += vecDrawBlack[i].top + rcCode.top;
        rcBlack.right = rcBlack.left + vecDrawBlack[i].Width();
        rcBlack.bottom = rcBlack.top + vecDrawBlack[i].Height();
        path->addRect(rcBlack);  
    }
    COLORREF clrFrgnd = GETCOLOR(L"RGB(0,0,0)"); //可自定义条码前景色
    CAutoRefPtr<IBrush> brush, oldbrush;
    pRT->CreateSolidColorBrush(clrFrgnd, &brush);
    pRT->SelectObject(brush, (IRenderObj**)&oldbrush);
    pRT->FillPath(path);
    pRT->SelectObject(oldbrush, NULL);
    
    //绘制文本(文本绘制可以选择绘制在底部还是顶部,自行计算文本位置然后进行绘制)
    SIZE szContent;
    pRT->MeasureText(m_sstrContent, m_sstrContent.GetLength(), &szContent); //文本整体的长度
    CRect rcText(rcCode);
    rcText.top = rcCode.bottom;
    rcText.bottom = rcText.top + szContent.cy;
    pRT->DrawText(m_sstrContent, -1, (LPRECT)rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
}
else
{
    //failed
    //可查看errtxt值查看失败描述
}
ZBarcode_Delete(symbol);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值