使用Font()
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。有任何想法吗?谢谢
答案 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)中总数的模数103值。
在大多数情况下,校验和字符将是以下的ASCII代码:(模数值 加上32)如上文3)中所确定的那样。
有一些细微差别,我最终需要在所有事情的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 条码有七个部分:
校验符号是根据所有符号的加权和(模 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!