如果标题有误导性我很抱歉但是我必须开发条形码的格式(1D或2D,无关紧要)。条形码需要包括采购订单#,提货单#,以及产品编号#和产品编号#以及采购订单上显示的每个项目的数量。 有人有任何想法吗?
这是我到目前为止所提出的:
PurchaseOrder# - 提单#| Product1ID Line #Qty | Product2ID Line #Qty |产品3 ...
这个想法的字符串实际上可能是这样的:
VO12340000-APX132 * 65465 1 12 * 897965 2 5 * 98464 3 88 *
这个想法使用“*”作为中断字符来区分项目之间的区别以及每个特定特征的所需长度。对我而言,似乎必须有更好的方法来实现这一目标。这个想法很难让我公司的供应商之一实施,因为它非常复杂和精确。任何关于如何实现这一目标的见解或想法将不胜感激。
编辑:虽然我使用的是VB.NET。这更像是一个通用的编程逻辑问题。答案 0 :(得分:1)
我们在这里使用QR码。在您的应用程序中,您可以使用纯文本格式,然后使用Regex处理它们。此外,它们还具有冗余和大量免费/开源软件,可支持生成和读取。
答案 1 :(得分:0)
还有其他复杂的条形码,如HIBC LIC和HIBC PAS,使用Code39或Code128(http://www.hibcc.org/autoidupn/standards.htm)实现。
重要的是使用能够生成精简条形码的符号系统,以便可被普通条形码扫描仪读取。因此,您可以使用Code39或Code128(GS1系列)并将*替换为任何(AIs / FUNC)。
如果我是你,我会使用Code93扩展符号系统,保留内容规范。
以下代码来自我过去为几乎所有符号系统制作的库,它将为您提供实现Code93 Extended所需的功能。它在C#中,但很容易将其转换为VB.NET。请记住,您必须根据需要对其进行修改,并且只生成一系列条形图而不绘制它们。
private static int[]
C93Table = { 131112, 111213, 111312, 111411, 121113, 121212, 121311, 111114, 131211, 141111, 211113, 211212, 211311, 221112, 221211, 231111, 112113, 112212, 112311, 122112, 132111, 111123, 111222, 111321, 121122, 131121, 212112, 212211, 211122, 211221, 221121, 222111, 112122, 112221, 122121, 123111, 121131, 311112, 311211, 321111, 112131, 113121, 211131, 121221, 312111, 311121, 122211 };
static string[]
C93TableX = { "bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "cD", "cE", "cF", "cG", "cH", "cI", "cJ", "cK", "cL", "cM", "cN", "cO", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO", "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT" };
static string C93Set = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd";
private void Code93X()
{
string source = request.Data;
Error valid = Validate(source, 197, C93Set);
if (valid != Error.None)
{
encoded = new Encoded() { Error = valid };
return;
}
StringBuilder adapt = new StringBuilder();
for (int i = 0; i < source.Length; i++)
adapt.Append(C93TableX[(byte)source[i]]);
Code93(adapt.ToString());
}
private void Code93(string source)
{
StringBuilder bars = new StringBuilder();
bars.Append(111141);
int c = 0, k = 0;
int[] values = new int[source.Length + 1];
for (int i = 0; i < source.Length; i++)
{
values[i] = C93Set.IndexOf(source[i]);
bars.Append(C93Table[values[i]]);
}
if (request.AddChecksum)
{
int weight = 1;
for (int i = source.Length - 1; i >= 0; i--)
{
c += values[i] * weight;
if (++weight == 21)
weight = 1;
}
c %= 47;
values[source.Length] = c;
bars.Append(C93Table[c]);
source += C93Set[c];
weight = 1;
for (int i = source.Length - 1; i >= 0; i--)
{
k += values[i] + weight;
if (++weight == 16)
weight = 1;
}
k %= 47;
bars.Append(C93Table[k]);
if (request.DisplayChecksum)
source += C93Set[k];
}
bars.Append(1111411);
source = string.Concat("*", source, "*");
encoded = new Encoded(bars.ToString(), source);
}
private Error Validate(string source, int maxLength, string set)
{
Error valid = Validate(source, maxLength);
if (valid == Error.None)
for (var i = 0; i < source.Length; i++)
if (set.IndexOf(source[i]) < 0)
{
valid = Error.InvalidCharacters;
break;
}
return valid;
}