- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要从一些文本生成 PDF417 条形码。我有一个 API(我没有创建)根据数据、行数和列数(以及与问题无关的其他参数)生成 PDF417 条形码。
我的 PDF417 条码使用文本编码。这意味着 1 个代码字最多可以容纳 2 个字符。现在,列数必须固定,因为我在非常有限的空间内打印此条形码。
以下是我从this document推断出来的(请参阅第 38 页 - 调整条码大小):
当我测试上述算法时,没有任何显示。当我在数据非常小且行数 = 25 时使用相同的 API 时,条形码打印得很好(通过各种条形码扫描仪验证)。
那么,当列数已知时,如何计算某些给定文本所需的行数?
最佳答案
您可以查看一些 PDF417 实现的源代码,例如 ZXing 。
文本编码不仅仅是每个代码字两个字符。如果您使用除大写字母和空格之外的任何其他字符,编码器将添加额外的字符来切换字符集等。您真的必须 encode the text 才能看到它会变成多少个代码字。
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.
关于algorithm - 在列数固定的 PDF417 条码中,我如何计算某些文本所需的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898890/
您如何计算Oracle表中的列数? 最佳答案 SELECT count(*) FROM user_tab_columns WHERE table_name = 'FOO' 应该给你foo中的列数。您可
我有一个宽度为 100% 的 div,里面有大约 10 张图片,所有图片的宽度和大小都不同。我希望能够无缝地将这些图像彼此 float ,我已经做到了,但它们不会在屏幕上拉伸(stretch),它们都
请看下面的代码,表格应该根据下面selected id选项中选择的输入更改行数,但只读取select id的第一个值,行数不会根据选择,你能指出我代码中的错误吗? http://jsfiddle.ne
我需要一个可以在 3×3 和 4×4 之间切换的动态 gridlayout。我可以 setRowCount 和 setColumnCount 从 3 到4 但不是从 4 到 3。它会显示以下问题: C
这里有一个没有真正答案的类似问题:CSS columns bug — 5 column count only showing 4 (with images) 我正在使用 column-count 来显
我正在尝试找到一种方法来填充摊销时间表,如下所示。 我目前使用的公式是: =IF($B2=$1:$1,$A2/$C2," ") 但是,这仅填充了第一个点(“起点”),我想做的是根据摊销期抵消这一点。期
我运行以下代码: import cv2 import numpy as np img_file='pokemon.jpg' img=cv2.imread(img_file) # print tota
我正在使用 asp.net 和 vb。这里我将数据绑定(bind)到Gridview。该数据集有 5 条记录,3 列,并且 gridview 显示 5 条记录,3 列。但 Gridview.colum
我已经为我的数据库苦苦挣扎了一段时间,几乎不可能找到我的老师。我的代码如下: INSERT INTO `database28`.`activity` VALUES ("Stefan", 1.1.2.2
我有一个执行 SQL 命令的 python 脚本,并尝试将所有数据插入表中。问题是我有一个条目列表,例如: "Bob", "bob@gmail.com" "John", "john@gmail.com
有谁知道这是否可以通过 bootstrap mixins 来完成。 列(父级数) 像什么Neat有。 在 Neat the Columns 中,mixins 的工作方式如下 @mixin span-c
我有这样的网址:http://xn----7sbabhi8cwaajmue5o.xn--p1ai/cars/search/by_man_and_model?by_manufacturer=115 你可
使用 Bootstrap 3,我正在寻找一种网格布局,其中列宽在任何屏幕分辨率下都是固定的(比如 200 像素),但它们的数量取决于屏幕宽度。 换句话说,我知道列的宽度,但我不知道每行有多少列,因为这
public class SmallestColumn2{ public static void main(String[] args){ int [][] smallest
如果我只有 9 列,但我想将它们分散到 100% 的 div。如何做到这一点? NSW VIC QLD WA SA TAS ACT N
我想在这里更改列的顺序: #container { position: relative; width: 600px; } #column-wrapper { -webkit-
1、df=DataFrame([{‘A':'11','B':'12'},{‘A':'111','B':'121'},{‘A':'1111','B':'1211'}])
我想将csv文件形式的数据导入表中。[使用Oracle SQL Developer]。我有数百个文件,每个文件有大约50列。 从SQL * Loader Wiki(http://www.orafaq.
好吧,这对我来说似乎很基础,尽管我找不到任何关于如何实现它的信息。 假设我有某种 QGridLayout 包含相同大小的小部件。现在我想根据布局大小更新其行数/列数。 因此,例如在相对较宽的屏幕上它看
我在 https://cwiki.apache.org/confluence/display/Hive/Home 中找不到任何记录在案的限制。 我的猜测是行数或列数没有限制。文件大小受文件系统限制。通
我是一名优秀的程序员,十分优秀!