⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 barcodepdf417.java

📁 iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        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 + -