在固定列数的PDF417条码中,如何计算某些文本所需的行数?

我需要从一些文本生成PDF417条码。我有一个API(我没有创建),该API在给定数据,行数和列数(以及与问题无关的其他参数)的情况下生成PDF417条形码。

我的PDF417条码使用文本编码。这意味着1个代码字最多可容纳2个字符。现在,由于我要在非常有限的空间中打印此条形码,因此必须固定列数。

以下是我从本文档中得出的结论(请参阅第38页-调整条形码大小):

  1. 设每行代码字的数量, = 7。
  2. 某些给定文本所需的代码字数量, = strlen(text)/ 2。
  3. 所需的行数= /

当我测试上述算法时,什么也没有显示。当数据很少且行数= 25时使用相同的API时,条形码可以很好地打印(已通过各种条形码扫描仪验证)。

那么,当列数已知时,如何计算某些给定文本所需的行数?

回答:

您可以查看一些PDF417实现的源代码,例如ZXing。

文本编码不仅是每个代码字两个字符。如果您使用大写字母和空格以外的任何其他字符,则编码器将添加额外的字符以切换字符集等。您实际上必须对文本进行编码,以查看它将变成多少个代码字。

public class Test

{

public static void main(String[] args)

{

String msg = "Hello, world!";

int columns = 7;

int sourceCodeWords = calculateSourceCodeWords(msg);

int errorCorrectionCodeWords = getErrorCorrectionCodewordCount(0);

int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, columns);

System.out.printf("\"%s\" requires %d code-words, and %d error correction code-words. This becomes %d rows.%n",

msg, sourceCodeWords, errorCorrectionCodeWords, rows);

}

public static int calculateNumberOfRows(int sourceCodeWords, int errorCorrectionCodeWords, int columns) {

int rows = ((sourceCodeWords + 1 + errorCorrectionCodeWords) / columns) + 1;

if (columns * rows >= (sourceCodeWords + 1 + errorCorrectionCodeWords + columns)) {

rows--;

}

return rows;

}

public static int getErrorCorrectionCodewordCount(int errorCorrectionLevel) {

if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {

throw new IllegalArgumentException("Error correction level must be between 0 and 8!");

}

return 1 << (errorCorrectionLevel + 1);

}

private static boolean isAlphaUpper(char ch) {

return ch == ' ' || (ch >= 'A' && ch <= 'Z');

}

private static boolean isAlphaLower(char ch) {

return ch == ' ' || (ch >= 'a' && ch <= 'z');

}

private static boolean isMixed(char ch) {

return "\t\r #$%&*+,-./0123456789:=^".indexOf(ch) > -1;

}

private static boolean isPunctuation(char ch) {

return "\t\n\r!\"$'()*,-./:;<>?@[\\]_`{|}~".indexOf(ch) > -1;

}

private static final int SUBMODE_ALPHA = 0;

private static final int SUBMODE_LOWER = 1;

private static final int SUBMODE_MIXED = 2;

private static final int SUBMODE_PUNCTUATION = 3;

public static int calculateSourceCodeWords(String msg)

{

int len = 0;

int submode = SUBMODE_ALPHA;

int msgLength = msg.length();

for (int idx = 0; idx < msgLength;)

{

char ch = msg.charAt(idx);

switch (submode)

{

case SUBMODE_ALPHA:

if (isAlphaUpper(ch))

{

len++;

}

else

{

if (isAlphaLower(ch))

{

submode = SUBMODE_LOWER;

len++;

continue;

}

else if (isMixed(ch))

{

submode = SUBMODE_MIXED;

len++;

continue;

}

else

{

len += 2;

break;

}

}

break;

case SUBMODE_LOWER:

if (isAlphaLower(ch))

{

len++;

}

else

{

if (isAlphaUpper(ch))

{

len += 2;

break;

}

else if (isMixed(ch))

{

submode = SUBMODE_MIXED;

len++;

continue;

}

else

{

len += 2;

break;

}

}

break;

case SUBMODE_MIXED:

if (isMixed(ch))

{

len++;

}

else

{

if (isAlphaUpper(ch))

{

submode = SUBMODE_ALPHA;

len++;

continue;

}

else if (isAlphaLower(ch))

{

submode = SUBMODE_LOWER;

len++;

continue;

}

else

{

if (idx + 1 < msgLength)

{

char next = msg.charAt(idx + 1);

if (isPunctuation(next))

{

submode = SUBMODE_PUNCTUATION;

len++;

continue;

}

}

len += 2;

}

}

break;

default:

if (isPunctuation(ch))

{

len++;

}

else

{

submode = SUBMODE_ALPHA;

len++;

continue;

}

break;

}

idx++; // Don't increment if 'continue' was used.

}

return (len + 1) / 2;

}

}

"Hello, world!" requires 9 code-words, and 2 error correction code-words.

This becomes 2 rows.

以上是 在固定列数的PDF417条码中,如何计算某些文本所需的行数? 的全部内容, 来源链接: utcz.com/qa/415740.html

回到顶部