acrofields.java

来自「源码包含生成 PDF 和 HTML 的类库」· Java 代码 · 共 1,451 行 · 第 1/5 页

JAVA
1,451
字号
     */        public String[] getListOptionExport(String fieldName) {        return getListOption(fieldName, 0);    }        /**     * Gets the list of display option values from fields of type list or combo.     * If the field doesn't exist or the field type is not list or combo it will return     * <CODE>null</CODE>.     * @param fieldName the field name     * @return the list of export option values from fields of type list or combo     */        public String[] getListOptionDisplay(String fieldName) {        return getListOption(fieldName, 1);    }        /**     * Sets the option list for fields of type list or combo. One of <CODE>exportValues</CODE>     * or <CODE>displayValues</CODE> may be <CODE>null</CODE> but not both. This method will only     * set the list but will not set the value or appearance. For that, calling <CODE>setField()</CODE>     * is required.     * <p>     * An example:     * <p>     * <PRE>     * PdfReader pdf = new PdfReader("input.pdf");     * PdfStamper stp = new PdfStamper(pdf, new FileOutputStream("output.pdf"));     * AcroFields af = stp.getAcroFields();     * af.setListOption("ComboBox", new String[]{"a", "b", "c"}, new String[]{"first", "second", "third"});     * af.setField("ComboBox", "b");     * stp.close();     * </PRE>     * @param fieldName the field name     * @param exportValues the export values     * @param displayValues the display values     * @return <CODE>true</CODE> if the operation succeeded, <CODE>false</CODE> otherwise     */        public boolean setListOption(String fieldName, String[] exportValues, String[] displayValues) {        if (exportValues == null && displayValues == null)            return false;        if (exportValues != null && displayValues != null && exportValues.length != displayValues.length)            throw new IllegalArgumentException("The export and the display array must have the same size.");        int ftype = getFieldType(fieldName);        if (ftype != FIELD_TYPE_COMBO && ftype != FIELD_TYPE_LIST)            return false;        Item fd = (Item)fields.get(fieldName);        String[] sing = null;        if (exportValues == null && displayValues != null)            sing = displayValues;        else if (exportValues != null && displayValues == null)            sing = exportValues;        PdfArray opt = new PdfArray();        if (sing != null) {            for (int k = 0; k < sing.length; ++k)                opt.add(new PdfString(sing[k], PdfObject.TEXT_UNICODE));        }        else {            for (int k = 0; k < exportValues.length; ++k) {                PdfArray a = new PdfArray();                a.add(new PdfString(exportValues[k], PdfObject.TEXT_UNICODE));                a.add(new PdfString(displayValues[k], PdfObject.TEXT_UNICODE));                opt.add(a);            }        }        ((PdfDictionary)fd.values.get(0)).put(PdfName.OPT, opt);        for (int j = 0; j < fd.merged.size(); ++j)            ((PdfDictionary)fd.merged.get(j)).put(PdfName.OPT, opt);        return true;    }        /**     * Gets the field type. The type can be one of: <CODE>FIELD_TYPE_PUSHBUTTON</CODE>,     * <CODE>FIELD_TYPE_CHECKBOX</CODE>, <CODE>FIELD_TYPE_RADIOBUTTON</CODE>,     * <CODE>FIELD_TYPE_TEXT</CODE>, <CODE>FIELD_TYPE_LIST</CODE>,     * <CODE>FIELD_TYPE_COMBO</CODE> or <CODE>FIELD_TYPE_SIGNATURE</CODE>.     * <p>     * If the field does not exist or is invalid it returns     * <CODE>FIELD_TYPE_NONE</CODE>.     * @param fieldName the field name     * @return the field type     */        public int getFieldType(String fieldName) {        Item fd = getFieldItem(fieldName);        if (fd == null)            return FIELD_TYPE_NONE;        PdfObject type = PdfReader.getPdfObject(((PdfDictionary)fd.merged.get(0)).get(PdfName.FT));        if (type == null)            return FIELD_TYPE_NONE;        int ff = 0;        PdfObject ffo = PdfReader.getPdfObject(((PdfDictionary)fd.merged.get(0)).get(PdfName.FF));        if (ffo != null && ffo.type() == PdfObject.NUMBER)            ff = ((PdfNumber)ffo).intValue();        if (PdfName.BTN.equals(type)) {            if ((ff & PdfFormField.FF_PUSHBUTTON) != 0)                return FIELD_TYPE_PUSHBUTTON;            if ((ff & PdfFormField.FF_RADIO) != 0)                return FIELD_TYPE_RADIOBUTTON;            else                return FIELD_TYPE_CHECKBOX;        }        else if (PdfName.TX.equals(type)) {            return FIELD_TYPE_TEXT;        }        else if (PdfName.CH.equals(type)) {            if ((ff & PdfFormField.FF_COMBO) != 0)                return FIELD_TYPE_COMBO;            else                return FIELD_TYPE_LIST;        }        else if (PdfName.SIG.equals(type)) {            return FIELD_TYPE_SIGNATURE;        }        return FIELD_TYPE_NONE;    }        /**     * Export the fields as a FDF.     * @param writer the FDF writer     */        public void exportAsFdf(FdfWriter writer) {        for (Iterator it = fields.entrySet().iterator(); it.hasNext();) {            Map.Entry entry = (Map.Entry)it.next();            Item item = (Item)entry.getValue();            String name = (String)entry.getKey();            PdfObject v = PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.V));            if (v == null)                continue;            String value = getField(name);            if (lastWasString)                writer.setFieldAsString(name, value);            else                writer.setFieldAsName(name, value);        }    }        /**     * Renames a field. Only the last part of the name can be renamed. For example,     * if the original field is "ab.cd.ef" only the "ef" part can be renamed.     * @param oldName the old field name     * @param newName the new field name     * @return <CODE>true</CODE> if the renaming was successful, <CODE>false</CODE>     * otherwise     */        public boolean renameField(String oldName, String newName) {        int idx1 = oldName.lastIndexOf('.') + 1;        int idx2 = newName.lastIndexOf('.') + 1;        if (idx1 != idx2)            return false;        if (!oldName.substring(0, idx1).equals(newName.substring(0, idx2)))            return false;        if (fields.containsKey(newName))            return false;        Item item = (Item)fields.get(oldName);        if (item == null)            return false;        newName = newName.substring(idx2);        PdfString ss = new PdfString(newName, PdfObject.TEXT_UNICODE);        for (int k = 0; k < item.merged.size(); ++k) {            PdfDictionary dic = (PdfDictionary)item.values.get(k);            dic.put(PdfName.T, ss);            markUsed(dic);            dic = (PdfDictionary)item.merged.get(k);            dic.put(PdfName.T, ss);        }        fields.remove(oldName);        fields.put(newName, item);        return true;    }        public static Object[] splitDAelements(String da) {        try {            PRTokeniser tk = new PRTokeniser(PdfEncodings.convertToBytes(da, null));            ArrayList stack = new ArrayList();            Object ret[] = new Object[3];            while (tk.nextToken()) {                if (tk.getTokenType() == PRTokeniser.TK_COMMENT)                    continue;                if (tk.getTokenType() == PRTokeniser.TK_OTHER) {                    String operator = tk.getStringValue();                    if (operator.equals("Tf")) {                        if (stack.size() >= 2) {                            ret[DA_FONT] = stack.get(stack.size() - 2);                            ret[DA_SIZE] = new Float((String)stack.get(stack.size() - 1));                        }                    }                    else if (operator.equals("g")) {                        if (stack.size() >= 1) {                            float gray = new Float((String)stack.get(stack.size() - 1)).floatValue();                            if (gray != 0)                                ret[DA_COLOR] = new GrayColor(gray);                        }                    }                    else if (operator.equals("rg")) {                        if (stack.size() >= 3) {                            float red = new Float((String)stack.get(stack.size() - 3)).floatValue();                            float green = new Float((String)stack.get(stack.size() - 2)).floatValue();                            float blue = new Float((String)stack.get(stack.size() - 1)).floatValue();                            ret[DA_COLOR] = new Color(red, green, blue);                        }                    }                    else if (operator.equals("k")) {                        if (stack.size() >= 4) {                            float cyan = new Float((String)stack.get(stack.size() - 4)).floatValue();                            float magenta = new Float((String)stack.get(stack.size() - 3)).floatValue();                            float yellow = new Float((String)stack.get(stack.size() - 2)).floatValue();                            float black = new Float((String)stack.get(stack.size() - 1)).floatValue();                            ret[DA_COLOR] = new CMYKColor(cyan, magenta, yellow, black);                        }                    }                    stack.clear();                }                else                    stack.add(tk.getStringValue());            }            return ret;        }        catch (IOException ioe) {            throw new ExceptionConverter(ioe);        }    }        public void decodeGenericDictionary(PdfDictionary merged, BaseField tx) throws IOException, DocumentException {        int flags = 0;        // the text size and color        PdfString da = (PdfString)PdfReader.getPdfObject(merged.get(PdfName.DA));        if (da != null) {            Object dab[] = splitDAelements(da.toUnicodeString());            if (dab[DA_SIZE] != null)                tx.setFontSize(((Float)dab[DA_SIZE]).floatValue());            if (dab[DA_COLOR] != null)                tx.setTextColor((Color)dab[DA_COLOR]);            if (dab[DA_FONT] != null) {                PdfDictionary font = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.DR));                if (font != null) {                    font = (PdfDictionary)PdfReader.getPdfObject(font.get(PdfName.FONT));                    if (font != null) {                        PdfObject po = font.get(new PdfName((String)dab[DA_FONT]));                        if (po != null && po.type() == PdfObject.INDIRECT) {                            PRIndirectReference por = (PRIndirectReference)po;                            BaseFont bp = new DocumentFont((PRIndirectReference)po);                            tx.setFont(bp);                            Integer porkey = new Integer(por.getNumber());                            BaseFont porf = (BaseFont)extensionFonts.get(porkey);                            if (porf == null) {                                if (!extensionFonts.containsKey(porkey)) {                                    PdfDictionary fo = (PdfDictionary)PdfReader.getPdfObject(po);                                    PdfDictionary fd = (PdfDictionary)PdfReader.getPdfObject(fo.get(PdfName.FONTDESCRIPTOR));                                    if (fd != null) {                                        PRStream prs = (PRStream)PdfReader.getPdfObject(fd.get(PdfName.FONTFILE2));                                        if (prs == null)                                            prs = (PRStream)PdfReader.getPdfObject(fd.get(PdfName.FONTFILE3));                                        if (prs == null) {                                            extensionFonts.put(porkey, null);                                        }                                        else {                                            try {                                                porf = BaseFont.createFont("font.ttf", BaseFont.IDENTITY_H, true, false, PdfReader.getStreamBytes(prs), null);                                            }                                            catch (Exception e) {                                            }                                            extensionFonts.put(porkey, porf);                                        }                                    }                                }                            }                            if (tx instanceof TextField)                                ((TextField)tx).setExtensionFont(porf);                        }                        else {                            BaseFont bf = (BaseFont)localFonts.get(dab[DA_FONT]);                            if (bf == null) {                                String fn[] = (String[])stdFieldFontNames.get(dab[DA_FONT]);                                if (fn != null) {                                    try {                                        String enc = "winansi";                                        if (fn.length > 1)                                            enc = fn[1];                                        bf = BaseFont.createFont(fn[0], enc, false);                                        tx.setFont(bf);                                    }                                    catch (Exception e) {                                        // empty                                    }                                }                            }                            else                                tx.setFont(bf);                        }                    }                }            }

⌨️ 快捷键说明

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