Output:
"Hello, world!" requires 9 code-words, and 2 error correction code-words. This becomes 2 rows.
本文地址:IT屋 » In a PDF417 barcode where number of columns are fixed, how would I calculate the number of rows required for some text?
我需要生成一些文本PDF417条码code。我有一个API(我没有创建)生成给出的数据的PDF417条码code,行数和列数(在其他参数无关的问题)的数量。
我的PDF417条码code使用文本编码。这意味着1 codeword最多可以容纳2个字符。现在,列的数量是固定的,因为我打印这个吧code在一个非常有限的空间。pdf417条码
下面是我从本文(参见第38页有推断 - 浆纱酒吧code):
让一些每行codewords, CWPerRow = 7。pdf417条码
所需要的某些给定的文本codewords号, ReqCW =的strlen(文本)/ 2。
所需的行数= ReqCW / CWPerRow
当我测试上面的算法,不显示任何内容。当我用同样的API时的数据非常小,行数= 25,酒吧code打印就好了(由不同吧code扫描仪验证)。
那么,如何计算需要时列数是已知的某些给定的文本行数?
解决方案
您可以看看一些PDF417执行源 - code,如 ZXing 。
文本编码是不是每个code字只是两个字符。如果您使用的不是大写字母和空间的任何其它字符,EN codeR将增加额外的字符切换字符集等你真的要恩code文本,看看有多少code-的话就会变成。
公共类测试
{
公共静态无效的主要(字串[] args)
{
弦乐味精=“你好,世界!”;
INT列= 7;
INT源$ C $ cWords = calculateSource codeWords(MSG);
INT误差纠正codeWords = getErrorCorrection codewordCount(0);
诠释行= calculateNumberOfRows(来源$ C $ cWords,误差纠正codeWords,列);
System.out.printf(“\”%s \“的要求%D code字,和%D纠错code字。这将成为%D行。%N”,
味精,源$ C $ cWords,误差纠正codeWords,行);
}
公共静态INT calculateNumberOfRows(INT源$ C $ cWords,诠释误差纠正codeWords,诠释列){
INT行数=((来源$ C $ cWords + 1 +误差纠正codeWords)/列)+ 1;
如果(列*行> =(来源$ C $ cWords + 1 +误差纠正codeWords +列)){
rows--;
}
返回行;
}
公共静态INT getErrorCorrection codewordCount(INT errorCorrectionLevel){
如果(errorCorrectionLevel℃,|| errorCorrectionLevel→8){
抛出新抛出:IllegalArgumentException(“纠错等级必须介于0和8!”);
}
返回1<< (errorCorrectionLevel + 1);
}
私有静态布尔isAlphaUpper(焦CH){
返回CH ==''|| (CH> ='A'和;&安培; CH< ='Z');
}
私有静态布尔isAlphaLower(焦CH){
返回CH ==''|| (CH> ='A'和;&安培; CH< ='Z');
}
私有静态布尔isMixed(焦CH){
回报“。\ t \ r#$%&放大器; * +, - / 0123456789:= ^”的indexOf(CH)>。 -1;
}
私有静态布尔isPunctuation(焦CH){
回归“\ t \ñ\ r \!”$“()*, - /:;?<> @ [\\] _`{|}〜”.indexOf(CH)> -1;
}
私有静态最终诠释SUBMODE_ALPHA = 0;
私有静态最终诠释SUBMODE_LOWER = 1;
私有静态最终诠释SUBMODE_MIXED = 2;
私有静态最终诠释SUBMODE_PUNCTUATION = 3;
公共静态INT calculateSource codeWords(弦乐味精)
{
INT的len = 0;
INT子模式= SUBMODE_ALPHA;
INT msgLength = msg.length();
对于(INT IDX = 0; IDX< msgLength)
{
焦炭CH = msg.charAt(IDX);
开关(子模式)
{
案例SUBMODE_ALPHA:
如果(isAlphaUpper(CH))
{
LEN ++;
}
其他
{
如果(isAlphaLower(CH))
{
子模式= SUBMODE_LOWER;
LEN ++;
继续;
}
否则,如果(isMixed(CH))
{
子模式= SUBMODE_MIXED;
LEN ++;
继续;
}
其他
{
LEN + = 2;
打破;
}
}
打破;
案例SUBMODE_LOWER:
如果(isAlphaLower(CH))
{
LEN ++;
}
其他
{
如果(isAlphaUpper(CH))
{
LEN + = 2;
打破;
}
否则,如果(isMixed(CH))
{
子模式= SUBMODE_MIXED;
LEN ++;
继续;
}
其他
{
LEN + = 2;
打破;
}
}
打破;
案例SUBMODE_MIXED:
如果(isMixed(CH))
{
LEN ++;
}
其他
{
如果(isAlphaUpper(CH))
{
子模式= SUBMODE_ALPHA;
LEN ++;
继续;
}
否则,如果(isAlphaLower(CH))
{
子模式= SUBMODE_LOWER;
LEN ++;
继续;
}
其他
{
如果(IDX + 1所述; msgLength)
{
炭下一= msg.charAt(IDX + 1);
如果(isPunctuation(下))
{
子模式= SUBMODE_PUNCTUATION;
LEN ++;
继续;
}
}
LEN + = 2;
}
}
打破;
默认:
如果(isPunctuation(CH))
{
LEN ++;
}
其他
{
子模式= SUBMODE_ALPHA;
LEN ++;
继续;
}
打破;
}
IDX ++; //不要增加,如果'继续'被使用。
}
返回(LEN + 1)/ 2;
}
}
输出:
“你好,世界!”需要9 code字,和2纠错code字。这将成为2行。
本文地址:IT屋 » 在PDF417条码code其中列数是固定的,我怎么会计算所需的一些文本行数?
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-37114-2.html
想太多