简体   繁体   中英

Creating Code128 barcode in C#

Stupid me I thought, that just writing some text with a barcode font, would make the scanner read it. Seems I was wrong.

So after reading some docs about code128 barcodes, I learned that:

  1. The barcode starts with (103, 104 or 105 dependent of the type)
  2. Then comes the string itself
  3. Then comes the modulo 103 of the calculated sum of each char in the string multiplied with its position
  4. Then 106 is appended

My code is:

public string Str = "MADS";
public string Barcode = null;

public void OnGet()
{

    int start = 104;
    int end = 106;
    int calc = start;
    Barcode = start.ToString();
    for (var i = 0; i < Str.Length; i++)
    {
        calc += (Convert.ToChar(Str[i]) - 32) * (i + 1);
        Barcode += Str[i];
    }

    double rem = calc % 103;
    Barcode += Convert.ToChar((int)rem + 32).ToString() + end;

    Console.WriteLine(Barcode);

}

I'm not sure how much to include in the Barcode string, for the scanner to read it?:

  • MADS,
  • 104MADS,
  • 104MADS,106

Or am I getting it all wrong?

Me references are:

Link 1 Link 2

Especially "Link 1", because I've tested that result with the scanner, and it works. Sadly I can't get my output to look like that.

Conclusion

After reading the comments and answers I think the best way for me is to use an existing library.

I chose NetBarcode GitHub link because it's .Net Core compatible.

Check this library: https://github.com/barnhill/barcodelib

On Nuget: https://github.com/barnhill/barcodelib

It will generate an image containing the barcode that reads as the text in input. Usage example:

BarcodeLib.Barcode b = new BarcodeLib.Barcode();
Image img = b.Encode(BarcodeLib.TYPE.CODE128, "038000356216", Color.Black, Color.White, 290, 120);

If you are using a barcode font, you need to include the Start character, data string, checksum and Stop character in the string you send to output, so the last in your example would be correct. The font only looks up each symbol and paints the bars and spaces for you. It knows nothing about the barcode symbology and rules itself.

 var buttonGen = document.getElementById("btnGen"); buttonGen.onclick = function () { var x = document.getElementById("textIn").value; var i, j, intWeight, intLength, intWtProd = 0, arrayData = [], fs; var arraySubst = [ "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê" ]; /* * Checksum Calculation for Code 128 B */ intLength = x.length; arrayData[0] = 104; // Assume Code 128B, Will revise to support A, C and switching. intWtProd = 104; for (j = 0; j < intLength; j += 1) { arrayData[j + 1] = x.charCodeAt(j) - 32; // Have to convert to Code 128 encoding intWeight = j + 1; // to generate the checksum intWtProd += intWeight * arrayData[j + 1]; // Just a weighted sum } arrayData[j + 1] = intWtProd % 103; // Modulo 103 on weighted sum arrayData[j + 2] = 106; // Code 128 Stop character chr = parseInt(arrayData[j + 1], 10); // Gotta convert from character to a number if (chr > 94) { chrString = arraySubst[chr - 95]; } else { chrString = String.fromCharCode(chr + 32); } // Change the font-size style to match the drop down fs = document.getElementsByTagName("option")[document.getElementById("selList").selectedIndex].value; document.getElementById("test").style.fontSize = fs + 'px'; document.getElementById("check").innerHTML = 'Checksum = ' + chr + ' or character ' + // Make It Visual chrString + ', for text = "' + x + '"'; document.getElementById("test").innerHTML = 'Ì' + // Start Code B x + // The originally typed string chrString + // The generated checksum 'Î'; // Stop Code }
 <html> <head> <link href="https://fonts.googleapis.com/css?family=Libre+Barcode+128+Text" rel="stylesheet"> <style> td, th { text-align: center; padding: 6px; } .ss { font-family: 'Libre Barcode 128 Text', cursive; font-size: 24px; } </style> </head> <body> &nbsp;Font Size:&nbsp; <select id="selList"> <option value="24" selected>24px</option> <option value="30">30px</option> <option value="36">36px</option> <option value="42">42px</option> <option value="48">48px</option> <option value="54">54px</option> <option value="60">60px</option> <option value="66">66px</option> <option value="72">72px</option> <option value="78">78px</option> <option value="84">84px</option> <option value="90">90px</option> <option value="96">96px</option> </select>&nbsp; <input type="text" id="textIn"></input> <input type="button" id="btnGen" value="Generate Code 128 Checksum" tabindex=4/> <div id="check"></div><br /><span id="test" class="ss">ÌMaking the Web Beautiful!$Î</span><br /> <p>This is a demonstration of use of the Libre Barcode 128 Font.</p> <p>Because the Libre Barcode Code 128 font does not generate checksums, you need this component to produce a scanning barcode.</p> <p>To use, just enter the text you want to embed in the barcode and press the generate button. Happy barcoding!</p> <p>By the way, Libre Barcode 128 Font uses the following high ASCII / unicode characters to implement the control codes symbols. (This is essentially adding 100 to the value, in other words 'Ã' is U+00C3 (195) to 'Î' is U+00CE (206).)</p> <table border="3"> <tr> <th>Value</th> <th>Encoding</th> <th>Subst</th> </tr> <tr><td> 95</td><td>A: US, B: DEL, C: 95</td><td>Ã</td></tr> <tr><td> 96</td><td>A: FNC 3, B: FNC 3, C: 96</td><td>Ä</td></tr> <tr><td> 97</td><td>A: FNC 2, B: FNC 2, C: 97</td><td>Å</td></tr> <tr><td> 98</td><td>A: Shift B, B: Shift A, C: 98</td><td>Æ</td></tr> <tr><td> 99</td><td>A: Code C, B: Code C, C: 99</td><td>Ç</td></tr> <tr><td>100</td><td>A: Code B, B: FNC 4, C: Code B</td><td>È</td></tr> <tr><td>101</td><td>A: FNC 4, B: Code A, C: Code A</td><td>É</td></tr> <tr><td>102</td><td>A: FNC 1, B: FNC 1, C: FNC 1</td><td>Ê</td></tr> <tr><td>103</td><td>Begin Code A</td><td>Ë</td></tr> <tr><td>104</td><td>Begin Code B</td><td>Ì</td></tr> <tr><td>105</td><td>Begin Code C</td><td>Í</td></tr> <tr><td>106</td><td>Stop Code</td><td>Î</td></tr></table> </body> </html>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM