我的条形码有问题(Code 128)

时间:2012-06-11 09:02:27

标签: c# .net barcode

使用Font()

生成3 of 9条形码很容易
Font f = new Font("Free 3 of 9", 80);
this.Font = f;

Label l = new Label();
l.Text = "*STACKOVERFLOW*";
l.Size = new System.Drawing.Size(800, 600);
this.Controls.Add(l);

this.Size = new Size(800, 600);

它的工作。我看到条形码,我能够扫描它。现在我想使用其他东西,比如Code 128为此我需要安装Font(完成)并且只需更改

Font f = new Font("Free 3 of 9", 80);Font f = new Font("Code 128", 80);

之后我在窗口看到条形码。问题是我无法扫描它。我认为这是因为我没有使用正确的开始停止标签作为条形码。据我所知,必须始终有一个开始/停止char或其他什么。对于Code 128的*中的3个我不确定。在维基上有开始代码A 所以我试过

Font f = new Font("<Start Code A>test<Stop>", 80);Font f = new Font("<Start Code A>test<Stop Code A>", 80);等等......我无法扫描输出。因为扫描仪无法找到启动和停止char。有任何想法吗?谢谢

4 个答案:

答案 0 :(得分:5)

您是否正在创建正确的校验和字符?

查看this page以了解如何计算校验和

有关替代方案,请查看以下链接 - 这允许您创建条形码位图:

http://www.codeproject.com/KB/graphics/BarcodeLibrary.aspx?fid=470627&fr=26#xx0xx

答案 1 :(得分:4)

代码128可以用完全正确的字体表示。它比9中的3个更棘手,因为你必须在末尾包含一个校验和字符,需要根据条形码的内容动态计算。还有3个不同的版本,每个版本都有不同的起始字符。

换句话说,条形码需要像:

[start char][barcode][checksum][stop char]

code128的好处是它比9中的3个更简洁。

This page帮助我计算算法以计算校验和。

该算法的一般概述是:

  1. 条形码的每个字符都会获得分配给它的特定值 取决于角色是什么以及它在哪里 条形码。

  2. 上面1)中的所有值都加在一起。

  3. 获取上述2)中总数的模数103值。

  4. 在大多数情况下,校验和字符将是以下的ASCII代码:(模数值 加上32)如上文3)中所确定的那样。

  5. 有一些细微差别,我最终需要在所有事情的javascript中创建这个算法(没有问题)。对于我自己将来的参考和展示一些细微差别,这就是它的样子:

    /*
     * This is the variable part of my barcode, I append this to a 
     * static prefix later, but I need to perform logic to compute the 
     * checksum for this variable. There is logic earlier that enforces 
     * this variable as a 9 character string containing only digits.   
     */ 
    var formIncrement = // a 9 char "digit" string variable
    
    /*
     * Dynamically compute the total checksum value (before modulus) 
     * for the variable part of my barcode, I will need to get a modulus 
     * from this total when I am done. If you need a variable number of 
     * characters in your barcodes or if they are not all digits 
     * obviously something different would have to be done here.  
     */ 
    var incrementCS = ((parseInt(formIncrement.charAt(0)) + 16) * 7) +
                      ((parseInt(formIncrement.charAt(1)) + 16) * 8) +
                      ((parseInt(formIncrement.charAt(2)) + 16) * 9) +
                      ((parseInt(formIncrement.charAt(3)) + 16) * 10) +
                      ((parseInt(formIncrement.charAt(4)) + 16) * 11) +
                      ((parseInt(formIncrement.charAt(5)) + 16) * 12) +
                      ((parseInt(formIncrement.charAt(6)) + 16) * 13) +
                      ((parseInt(formIncrement.charAt(7)) + 16) * 14) + 
                      ((parseInt(formIncrement.charAt(8)) + 16) * 15);
    
    /*
     * 452 is the total checksum for my barcodes static prefix (600001), 
     * so it doesn't need to be computed dynamically, I just add it to 
     * the variable checksum total determined above and then get the 
     * modulus of that sum:  
     */ 
    var checksum = (452 + incrementCS) % 103
    
    
    var barcode = "š600001" + formIncrement
    
    /*
     * The 0 and the 95 - 102 cases had to be defined explicitly because 
     * their checksum figures do not line up with the javascript char 
     * codes for some reason (see the code 128 definition table in the 
     * linked page) otherwise we simply need to get the charCode of the 
     * checksum + 32. I also tack on the stop char here. 
     */ 
    switch (checksum) {
        case 0 :
        barcode += "€œ";
        break;
        case 95 :
        barcode += "‘œ";
        break;
        case 96 :
        barcode += "’œ";
        break;
        case 97 :
        barcode += "“œ";
        break;
        case 98 :
        barcode += "”œ";
        break;
        case 99 :
        barcode += "•œ";
        break;
        case 100 :
        barcode += "–œ";
        break;
        case 101 :
        barcode += "—œ";
        break;
        case 102 :
        barcode += "˜œ";
        break;
        default :
        barcode += String.fromCharCode(checksum + 32) + "œ";
    }
    
    return barcode;
    

    您可能会注意到我的示例中的开始和停止字符(š,œ)似乎与链接页面上显示的字符不匹配。如果我记得我认为这是因为我有一些非标准的code128字体,这些字符转换为正确的字符。

    修改

    我在文档中查了回来。看起来我从right here得到了字体。有了这个字体并使用上面的算法,我只为test制作了一个代码128b条形码,它出现在štestwœ,它扫描得很好。您的校验和算法似乎运行正常,因为我们都有w但是如果您获得了ÌtestwÎ,则看起来您的起止码已经关闭。

    我指出要查找我正在使用的相同条形码字体,因为我觉得不同品牌的code128字体可能会实现不同的字符来表示开始和停止条形码。

答案 2 :(得分:1)

查看条形码128的Wikipedia page,我认为您应该使用ASCII代码208-210来分隔一个块,根据条形码宽度段落和表格。

答案 3 :(得分:0)

规格

Wikipedia's Code 128 page 对规范的解释如下:

Code 128 条码有七个部分:

  1. 安静区
  2. 开始符号
  3. 编码数据
  4. 复选符号(必填)
  5. 停止符号
  6. 最后一栏(通常被视为停止符号的一部分)
  7. 安静区

校验符号是根据所有符号的加权和(模 103)计算得出的。

数据编码

字体将处理所需的区域和线条,以及我们需要提供开始和停止符号以及校验符号的数据。

Check digit calculation 部分解释了校验和的计算方法是将起始代码“值”与每个符号的“值”乘以其在条形码字符串中的位置的乘积相加。然后乘积之和以103为模减少。由于本例中的起始码值为103,其中模103为0,因此可以忽略它,我们只需要对数据符号进行统计即可。

使用 Free barcode fonts @ dobsonsw,它是 Code 128B 或 Code set B,字体支持 95 个字符,ASCII 字符 32 到 127。为了显示校验符号,还有 9 个额外的无序溢出字符需要考虑。

@egerardus 计算出这种特殊字体使用非标准的开始 (353) 和停止 (339) 符号以及不同范围的溢出字符 (8216, 8217, 8220, 8221, 8226, 8211, 8212, 0732, 8364)。

实施

以下是条码数据编码的工作 C# 实现。

private string BarcodeEncode(string value)
{
    int[] overChars = { 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8364 };
    char[] valueChars = value.ToCharArray();
    int[] checksumVals = new int[value.Length];

    for (int n = 0; n < valueChars.Length; n++)
    {
        checksumVals[n] = (((byte)valueChars[n]) - 32) * (n + 1);
    }

    int checksum = checksumVals.Sum() % 103;
    char check = (char)(checksum + 33);
    if (checksum > 93)
        check = (char)overChars[checksum - 94];

    string start = ((char)353).ToString();
    string stop = ((char)339).ToString();

    return start + value + check.ToString() + stop;
}

后跟等效的 JavaScript 实现。

function barcodeEncode(value) {
    var overChars = [8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8364];
    var checksum = [...value]
            .map((i, n) => (i.charCodeAt(0) - 32) * ++n)
            .reduce((a, b) => a + b, 0) % 103;
    return String.fromCharCode(353) + value
        + (checksum < 94
            ? String.fromCharCode(checksum + 33)
            : String.fromCharCode(overChars[checksum - 94]))
        + String.fromCharCode(339);
}

nJoy!