acrofields.java

来自「有关对pdf操作的代码」· Java 代码 · 共 1,444 行 · 第 1/5 页

JAVA
1,444
字号
                    }                }            }        }        //rotation, border and background color        PdfDictionary mk = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.MK));        if (mk != null) {            PdfArray ar = (PdfArray)PdfReader.getPdfObject(mk.get(PdfName.BC));            Color border = getMKColor(ar);            tx.setBorderColor(border);            if (border != null)                tx.setBorderWidth(1);            ar = (PdfArray)PdfReader.getPdfObject(mk.get(PdfName.BG));            tx.setBackgroundColor(getMKColor(ar));            PdfNumber rotation = (PdfNumber)PdfReader.getPdfObject(mk.get(PdfName.R));            if (rotation != null)                tx.setRotation(rotation.intValue());        }        //flags        PdfNumber nfl = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.F));        flags = 0;        tx.setVisibility(BaseField.VISIBLE_BUT_DOES_NOT_PRINT);        if (nfl != null) {            flags = nfl.intValue();            if ((flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_HIDDEN) != 0)                tx.setVisibility(BaseField.HIDDEN);            else if ((flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_NOVIEW) != 0)                tx.setVisibility(BaseField.HIDDEN_BUT_PRINTABLE);            else if ((flags & PdfFormField.FLAGS_PRINT) != 0)                tx.setVisibility(BaseField.VISIBLE);        }        //multiline        nfl = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.FF));        flags = 0;        if (nfl != null)            flags = nfl.intValue();        tx.setOptions(flags);        if ((flags & PdfFormField.FF_COMB) != 0) {            PdfNumber maxLen = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.MAXLEN));            int len = 0;            if (maxLen != null)                len = maxLen.intValue();            tx.setMaxCharacterLength(len);        }        //alignment        nfl = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.Q));        if (nfl != null) {            if (nfl.intValue() == PdfFormField.Q_CENTER)                tx.setAlignment(Element.ALIGN_CENTER);            else if (nfl.intValue() == PdfFormField.Q_RIGHT)                tx.setAlignment(Element.ALIGN_RIGHT);        }        //border styles        PdfDictionary bs = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.BS));        if (bs != null) {            PdfNumber w = (PdfNumber)PdfReader.getPdfObject(bs.get(PdfName.W));            if (w != null)                tx.setBorderWidth(w.floatValue());            PdfName s = (PdfName)PdfReader.getPdfObject(bs.get(PdfName.S));            if (PdfName.D.equals(s))                tx.setBorderStyle(PdfBorderDictionary.STYLE_DASHED);            else if (PdfName.B.equals(s))                tx.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED);            else if (PdfName.I.equals(s))                tx.setBorderStyle(PdfBorderDictionary.STYLE_INSET);            else if (PdfName.U.equals(s))                tx.setBorderStyle(PdfBorderDictionary.STYLE_UNDERLINE);        }        else {            PdfArray bd = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.BORDER));            if (bd != null) {                ArrayList ar = bd.getArrayList();                if (ar.size() >= 3)                    tx.setBorderWidth(((PdfNumber)ar.get(2)).floatValue());                if (ar.size() >= 4)                    tx.setBorderStyle(PdfBorderDictionary.STYLE_DASHED);            }        }    }        PdfAppearance getAppearance(PdfDictionary merged, String text, String fieldName) throws IOException, DocumentException {        topFirst = 0;        TextField tx = null;        if (fieldCache == null || !fieldCache.containsKey(fieldName)) {            tx = new TextField(writer, null, null);            tx.setExtraMargin(extraMarginLeft, extraMarginTop);            tx.setBorderWidth(0);            tx.setSubstitutionFonts(substitutionFonts);            decodeGenericDictionary(merged, tx);            //rect            PdfArray rect = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.RECT));            Rectangle box = PdfReader.getNormalizedRectangle(rect);            if (tx.getRotation() == 90 || tx.getRotation() == 270)                box = box.rotate();            tx.setBox(box);            if (fieldCache != null)                fieldCache.put(fieldName, tx);        }        else {            tx = (TextField)fieldCache.get(fieldName);            tx.setWriter(writer);        }        PdfName fieldType = (PdfName)PdfReader.getPdfObject(merged.get(PdfName.FT));        if (PdfName.TX.equals(fieldType)) {            tx.setText(text);            return tx.getAppearance();        }        if (!PdfName.CH.equals(fieldType))            throw new DocumentException("An appearance was requested without a variable text field.");        PdfArray opt = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.OPT));        int flags = 0;        PdfNumber nfl = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.FF));        if (nfl != null)            flags = nfl.intValue();        if ((flags & PdfFormField.FF_COMBO) != 0 && opt == null) {            tx.setText(text);            return tx.getAppearance();        }        if (opt != null) {            ArrayList op = opt.getArrayList();            String choices[] = new String[op.size()];            String choicesExp[] = new String[op.size()];            for (int k = 0; k < op.size(); ++k) {                PdfObject obj = (PdfObject)op.get(k);                if (obj.isString()) {                    choices[k] = choicesExp[k] = ((PdfString)obj).toUnicodeString();                }                else {                    ArrayList opar = ((PdfArray)obj).getArrayList();                    choicesExp[k] = ((PdfString)opar.get(0)).toUnicodeString();                    choices[k] = ((PdfString)opar.get(1)).toUnicodeString();                }            }            if ((flags & PdfFormField.FF_COMBO) != 0) {                for (int k = 0; k < choices.length; ++k) {                    if (text.equals(choicesExp[k])) {                        text = choices[k];                        break;                    }                }                tx.setText(text);                return tx.getAppearance();            }            int idx = 0;            for (int k = 0; k < choicesExp.length; ++k) {                if (text.equals(choicesExp[k])) {                    idx = k;                    break;                }            }            tx.setChoices(choices);            tx.setChoiceExports(choicesExp);            tx.setChoiceSelection(idx);        }        PdfAppearance app = tx.getListAppearance();        topFirst = tx.getTopFirst();        return app;    }        Color getMKColor(PdfArray ar) {        if (ar == null)            return null;        ArrayList cc = ar.getArrayList();        switch (cc.size()) {            case 1:                return new GrayColor(((PdfNumber)cc.get(0)).floatValue());            case 3:                return new Color(ExtendedColor.normalize(((PdfNumber)cc.get(0)).floatValue()), ExtendedColor.normalize(((PdfNumber)cc.get(1)).floatValue()), ExtendedColor.normalize(((PdfNumber)cc.get(2)).floatValue()));            case 4:                return new CMYKColor(((PdfNumber)cc.get(0)).floatValue(), ((PdfNumber)cc.get(1)).floatValue(), ((PdfNumber)cc.get(2)).floatValue(), ((PdfNumber)cc.get(3)).floatValue());            default:                return null;        }    }        /** Gets the field value.     * @param name the fully qualified field name     * @return the field value     */        public String getField(String name) {        if (xfa.isXfaPresent()) {            name = xfa.findFieldName(name, this);            if (name == null)                return null;            name = XfaForm.Xml2Som.getShortName(name);            return XfaForm.getNodeText(xfa.findDatasetsNode(name));        }        Item item = (Item)fields.get(name);        if (item == null)            return null;        lastWasString = false;        PdfObject v = PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.V));        if (v == null)            return "";        PdfName type = (PdfName)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.FT));        if (PdfName.BTN.equals(type)) {            PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.FF));            int flags = 0;            if (ff != null)                flags = ff.intValue();            if ((flags & PdfFormField.FF_PUSHBUTTON) != 0)                return "";            String value = "";            if (v.isName())                value = PdfName.decodeName(v.toString());            else if (v.isString())                value = ((PdfString)v).toUnicodeString();            PdfObject opts = PdfReader.getPdfObject(((PdfDictionary)item.values.get(0)).get(PdfName.OPT));            if (opts != null && opts.isArray()) {                ArrayList list = ((PdfArray)opts).getArrayList();                int idx = 0;                try {                    idx = Integer.parseInt(value);                    PdfString ps = (PdfString)list.get(idx);                    value = ps.toUnicodeString();                    lastWasString = true;                }                catch (Exception e) {                }            }            return value;        }        if (v.isString()) {            lastWasString = true;            return ((PdfString)v).toUnicodeString();        }        return PdfName.decodeName(v.toString());    }    /**     * Sets a field property. Valid property names are:     * <p>     * <ul>     * <li>textfont - sets the text font. The value for this entry is a <CODE>BaseFont</CODE>.<br>     * <li>textcolor - sets the text color. The value for this entry is a <CODE>java.awt.Color</CODE>.<br>     * <li>textsize - sets the text size. The value for this entry is a <CODE>Float</CODE>.     * <li>bgcolor - sets the background color. The value for this entry is a <CODE>java.awt.Color</CODE>.     *     If <code>null</code> removes the background.<br>     * <li>bordercolor - sets the border color. The value for this entry is a <CODE>java.awt.Color</CODE>.     *     If <code>null</code> removes the border.<br>     * </ul>     * @param field the field name     * @param name the property name     * @param value the property value     * @param inst an array of <CODE>int</CODE> indexing into <CODE>AcroField.Item.merged</CODE> elements to process.     * Set to <CODE>null</CODE> to process all     * @return <CODE>true</CODE> if the property exists, <CODE>false</CODE> otherwise     */        public boolean setFieldProperty(String field, String name, Object value, int inst[]) {        if (writer == null)            throw new RuntimeException("This AcroFields instance is read-only.");        try {            Item item = (Item)fields.get(field);            if (item == null)                return false;            InstHit hit = new InstHit(inst);            if (name.equalsIgnoreCase("textfont")) {                for (int k = 0; k < item.merged.size(); ++k) {                    if (hit.isHit(k)) {                        PdfString da = (PdfString)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.DA));                        PdfDictionary dr = (PdfDictionary)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.DR));                        if (da != null && dr != null) {                            Object dao[] = splitDAelements(da.toUnicodeString());                            PdfAppearance cb = new PdfAppearance();                            if (dao[DA_FONT] != null) {                                BaseFont bf = (BaseFont)value;                                PdfName psn = (PdfName)PdfAppearance.stdFieldFontNames.get(bf.getPostscriptFontName());                                if (psn == null) {                                    psn = new PdfName(bf.getPostscriptFontName());                                }                                PdfDictionary fonts = (PdfDictionary)PdfReader.getPdfObject(dr.get(PdfName.FONT));                                if (fonts == null) {                                    fonts = new PdfDictionary();                                    dr.put(PdfName.FONT, fonts);                                }                                PdfIndirectReference fref = (PdfIndirectReference)fonts.get(psn);                                PdfDictionary top = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM));                                markUsed(top);                                dr = (PdfDictionary)PdfReader.getPdfObject(top.get(PdfName.DR));                                if (dr == null) {                                    dr = new PdfDictionary();                                    top.put(PdfName.DR, dr);                                }                                markUsed(dr);                                PdfDictionary fontsTop = (PdfDictionary)PdfReader.getPdfObject(dr.get(PdfName.FONT));                                if (fontsTop == null) {                                    fontsTop = new PdfDictionary();                                    dr.put(PdfName.FONT, fontsTop);                                }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?