📄 barcodepdf417.java
字号:
if (nd >= 13)
segmentList.add('N', startN, textLength);
//optimize
//merge short binary
for (k = 0; k < segmentList.size(); ++k) {
v = segmentList.get(k);
vp = segmentList.get(k - 1);
vn = segmentList.get(k + 1);
if (checkSegmentType(v, 'B') && getSegmentLength(v) == 1) {
if (checkSegmentType(vp, 'T') && checkSegmentType(vn, 'T')
&& getSegmentLength(vp) + getSegmentLength(vn) >= 3) {
vp.end = vn.end;
segmentList.remove(k);
segmentList.remove(k);
k = -1;
continue;
}
}
}
//merge text sections
for (k = 0; k < segmentList.size(); ++k) {
v = segmentList.get(k);
vp = segmentList.get(k - 1);
vn = segmentList.get(k + 1);
if (checkSegmentType(v, 'T') && getSegmentLength(v) >= 5) {
boolean redo = false;
if ((checkSegmentType(vp, 'B') && getSegmentLength(vp) == 1) || checkSegmentType(vp, 'T')) {
redo = true;
v.start = vp.start;
segmentList.remove(k - 1);
--k;
}
if ((checkSegmentType(vn, 'B') && getSegmentLength(vn) == 1) || checkSegmentType(vn, 'T')) {
redo = true;
v.end = vn.end;
segmentList.remove(k + 1);
}
if (redo) {
k = -1;
continue;
}
}
}
//merge binary sections
for (k = 0; k < segmentList.size(); ++k) {
v = segmentList.get(k);
vp = segmentList.get(k - 1);
vn = segmentList.get(k + 1);
if (checkSegmentType(v, 'B')) {
boolean redo = false;
if ((checkSegmentType(vp, 'T') && getSegmentLength(vp) < 5) || checkSegmentType(vp, 'B')) {
redo = true;
v.start = vp.start;
segmentList.remove(k - 1);
--k;
}
if ((checkSegmentType(vn, 'T') && getSegmentLength(vn) < 5) || checkSegmentType(vn, 'B')) {
redo = true;
v.end = vn.end;
segmentList.remove(k + 1);
}
if (redo) {
k = -1;
continue;
}
}
}
// check if all numbers
if (segmentList.size() == 1 && (v = segmentList.get(0)).type == 'T' && getSegmentLength(v) >= 8) {
for (k = v.start; k < v.end; ++k) {
c = (char)(text[k] & 0xff);
if (c < '0' || c > '9')
break;
}
if (k == v.end)
v.type = 'N';
}
}
protected void assemble() {
int k;
if (segmentList.size() == 0)
return;
cwPtr = 1;
for (k = 0; k < segmentList.size(); ++k) {
Segment v = segmentList.get(k);
switch (v.type) {
case 'T':
if (k != 0)
codewords[cwPtr++] = TEXT_MODE;
textCompaction(v.start, getSegmentLength(v));
break;
case 'N':
codewords[cwPtr++] = NUMERIC_MODE;
numberCompaction(v.start, getSegmentLength(v));
break;
case 'B':
codewords[cwPtr++] = (getSegmentLength(v) % 6) != 0 ? BYTE_MODE : BYTE_MODE_6;
byteCompaction(v.start, getSegmentLength(v));
break;
}
}
if ((options & PDF417_USE_MACRO) != 0) {
macroCodes();
}
}
private void macroCodes() {
if (macroSegmentId < 0) {
throw new IllegalStateException("macroSegmentId must be >=0");
}
if (macroSegmentId >= macroSegmentCount) {
throw new IllegalStateException("macroSegmentId must be < macroSemgentCount");
}
if (macroSegmentCount < 1) {
throw new IllegalStateException("macroSemgentCount must be > 0");
}
codewords[cwPtr++] = MACRO_SEGMENT_ID;
append(macroSegmentId, 5);
if (macroFileId != null) {
append(macroFileId);
}
codewords[cwPtr++] = MACRO_SEGMENT_COUNT;
codewords[cwPtr++] = 1;
append(macroSegmentCount, 5);
if (macroSegmentId >= macroSegmentCount-1) {
codewords[cwPtr++] = MACRO_LAST_SEGMENT;
}
}
private void append(int in, int len) {
StringBuffer sb = new StringBuffer(len+1);
sb.append(Integer.toString(in));
for(int i = sb.length(); i < len; i++) {
sb.insert(0, "0");
}
byte[] bytes = PdfEncodings.convertToBytes(sb.toString(), "cp437");
numberCompaction(bytes, 0, bytes.length);
}
private void append(String s) {
byte[] bytes = PdfEncodings.convertToBytes(s, "cp437");
textCompaction(bytes, 0, bytes.length);
}
protected static int maxPossibleErrorLevel(int remain) {
int level = 8;
int size = 512;
while (level > 0) {
if (remain >= size)
return level;
--level;
size >>= 1;
}
return 0;
}
protected void dumpList() {
if (segmentList.size() == 0)
return;
for (int k = 0; k < segmentList.size(); ++k) {
Segment v = segmentList.get(k);
int len = getSegmentLength(v);
char c[] = new char[len];
for (int j = 0; j < len; ++j) {
c[j] = (char)(text[v.start + j] & 0xff);
if (c[j] == '\r')
c[j] = '\n';
}
StringBuffer sb = new StringBuffer();
sb.append(v.type);
sb.append(c);
System.out.println(sb.toString());
}
}
protected int getMaxSquare() {
if (codeColumns > 21) {
codeColumns = 29;
codeRows = 32;
}
else {
codeColumns = 16;
codeRows = 58;
}
return MAX_DATA_CODEWORDS + 2;
}
/** Paints the barcode. If no exception was thrown a valid barcode is available. */
public void paintCode() {
int maxErr, lenErr, tot, pad;
if ((options & PDF417_USE_RAW_CODEWORDS) != 0) {
if (lenCodewords > MAX_DATA_CODEWORDS || lenCodewords < 1 || lenCodewords != codewords[0]) {
throw new IllegalArgumentException("Invalid codeword size.");
}
}
else {
if (text == null)
throw new NullPointerException("Text cannot be null.");
if (text.length > ABSOLUTE_MAX_TEXT_SIZE) {
throw new IndexOutOfBoundsException("The text is too big.");
}
segmentList = new SegmentList();
breakString();
//dumpList();
assemble();
segmentList = null;
codewords[0] = lenCodewords = cwPtr;
}
maxErr = maxPossibleErrorLevel(MAX_DATA_CODEWORDS + 2 - lenCodewords);
if ((options & PDF417_USE_ERROR_LEVEL) == 0) {
if (lenCodewords < 41)
errorLevel = 2;
else if (lenCodewords < 161)
errorLevel = 3;
else if (lenCodewords < 321)
errorLevel = 4;
else
errorLevel = 5;
}
if (errorLevel < 0)
errorLevel = 0;
else if (errorLevel > maxErr)
errorLevel = maxErr;
if (codeColumns < 1)
codeColumns = 1;
else if (codeColumns > 30)
codeColumns = 30;
if (codeRows < 3)
codeRows = 3;
else if (codeRows > 90)
codeRows = 90;
lenErr = 2 << errorLevel;
boolean fixedColumn = (options & PDF417_FIXED_ROWS) == 0;
boolean skipRowColAdjust = false;
tot = lenCodewords + lenErr;
if ((options & PDF417_FIXED_RECTANGLE) != 0) {
tot = codeColumns * codeRows;
if (tot > MAX_DATA_CODEWORDS + 2) {
tot = getMaxSquare();
}
if (tot < lenCodewords + lenErr)
tot = lenCodewords + lenErr;
else
skipRowColAdjust = true;
}
else if ((options & (PDF417_FIXED_COLUMNS | PDF417_FIXED_ROWS)) == 0) {
double c, b;
fixedColumn = true;
if (aspectRatio < 0.001)
aspectRatio = 0.001f;
else if (aspectRatio > 1000)
aspectRatio = 1000;
b = 73 * aspectRatio - 4;
c = (-b + Math.sqrt(b * b + 4 * 17 * aspectRatio * (lenCodewords + lenErr) * yHeight)) / (2 * 17 * aspectRatio);
codeColumns = (int)(c + 0.5);
if (codeColumns < 1)
codeColumns = 1;
else if (codeColumns > 30)
codeColumns = 30;
}
if (!skipRowColAdjust) {
if (fixedColumn) {
codeRows = (tot - 1) / codeColumns + 1;
if (codeRows < 3)
codeRows = 3;
else if (codeRows > 90) {
codeRows = 90;
codeColumns = (tot - 1) / 90 + 1;
}
}
else {
codeColumns = (tot - 1) / codeRows + 1;
if (codeColumns > 30) {
codeColumns = 30;
codeRows = (tot - 1) / 30 + 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -