acrofields.java

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

JAVA
1,451
字号
                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);                                }                                markUsed(fontsTop);                                PdfIndirectReference frefTop = (PdfIndirectReference)fontsTop.get(psn);                                if (frefTop != null) {                                    if (fref == null)                                        fonts.put(psn, frefTop);                                }                                else if (fref == null) {                                    FontDetails fd;                                    if (bf.getFontType() == BaseFont.FONT_TYPE_DOCUMENT) {                                        fd = new FontDetails(null, ((DocumentFont)bf).getIndirectReference(), bf);                                    }                                    else {                                        bf.setSubset(false);                                        fd = writer.addSimple(bf);                                        localFonts.put(psn.toString().substring(1), bf);                                    }                                    fontsTop.put(psn, fd.getIndirectReference());                                    fonts.put(psn, fd.getIndirectReference());                                }                                ByteBuffer buf = cb.getInternalBuffer();                                buf.append(psn.getBytes()).append(' ').append(((Float)dao[DA_SIZE]).floatValue()).append(" Tf ");                                if (dao[DA_COLOR] != null)                                    cb.setColorFill((Color)dao[DA_COLOR]);                                PdfString s = new PdfString(cb.toString());                                ((PdfDictionary)item.merged.get(k)).put(PdfName.DA, s);                                ((PdfDictionary)item.widgets.get(k)).put(PdfName.DA, s);                                markUsed((PdfDictionary)item.widgets.get(k));                            }                        }                    }                }            }            else if (name.equalsIgnoreCase("textcolor")) {                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));                        if (da != null) {                            Object dao[] = splitDAelements(da.toUnicodeString());                            PdfAppearance cb = new PdfAppearance();                            if (dao[DA_FONT] != null) {                                ByteBuffer buf = cb.getInternalBuffer();                                buf.append(new PdfName((String)dao[DA_FONT]).getBytes()).append(' ').append(((Float)dao[DA_SIZE]).floatValue()).append(" Tf ");                                cb.setColorFill((Color)value);                                PdfString s = new PdfString(cb.toString());                                ((PdfDictionary)item.merged.get(k)).put(PdfName.DA, s);                                ((PdfDictionary)item.widgets.get(k)).put(PdfName.DA, s);                                markUsed((PdfDictionary)item.widgets.get(k));                            }                        }                    }                }            }            else if (name.equalsIgnoreCase("textsize")) {                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));                        if (da != null) {                            Object dao[] = splitDAelements(da.toUnicodeString());                            PdfAppearance cb = new PdfAppearance();                            if (dao[DA_FONT] != null) {                                ByteBuffer buf = cb.getInternalBuffer();                                buf.append(new PdfName((String)dao[DA_FONT]).getBytes()).append(' ').append(((Float)value).floatValue()).append(" Tf ");                                if (dao[DA_COLOR] != null)                                    cb.setColorFill((Color)dao[DA_COLOR]);                                PdfString s = new PdfString(cb.toString());                                ((PdfDictionary)item.merged.get(k)).put(PdfName.DA, s);                                ((PdfDictionary)item.widgets.get(k)).put(PdfName.DA, s);                                markUsed((PdfDictionary)item.widgets.get(k));                            }                        }                    }                }            }            else if (name.equalsIgnoreCase("bgcolor") || name.equalsIgnoreCase("bordercolor")) {                PdfName dname = (name.equalsIgnoreCase("bgcolor") ? PdfName.BG : PdfName.BC);                for (int k = 0; k < item.merged.size(); ++k) {                    if (hit.isHit(k)) {                        PdfObject obj = PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.MK));                        markUsed(obj);                        PdfDictionary mk = (PdfDictionary)obj;                        if (mk == null) {                            if (value == null)                                return true;                            mk = new PdfDictionary();                            ((PdfDictionary)item.merged.get(k)).put(PdfName.MK, mk);                            ((PdfDictionary)item.widgets.get(k)).put(PdfName.MK, mk);                            markUsed((PdfDictionary)item.widgets.get(k));                        }                        if (value == null)                            mk.remove(dname);                        else                            mk.put(dname, PdfFormField.getMKColor((Color)value));                    }                }            }            else                return false;            return true;        }        catch (Exception e) {            throw new ExceptionConverter(e);        }    }        /**     * Sets a field property. Valid property names are:     * <p>     * <ul>     * <li>flags - a set of flags specifying various characteristics of the field's widget annotation.     * The value of this entry replaces that of the F entry in the form's corresponding annotation dictionary.<br>     * <li>setflags - a set of flags to be set (turned on) in the F entry of the form's corresponding     * widget annotation dictionary. Bits equal to 1 cause the corresponding bits in F to be set to 1.<br>     * <li>clrflags - a set of flags to be cleared (turned off) in the F entry of the form's corresponding     * widget annotation dictionary. Bits equal to 1 cause the corresponding     * bits in F to be set to 0.<br>     * <li>fflags - a set of flags specifying various characteristics of the field. The value     * of this entry replaces that of the Ff entry in the form's corresponding field dictionary.<br>     * <li>setfflags - a set of flags to be set (turned on) in the Ff entry of the form's corresponding     * field dictionary. Bits equal to 1 cause the corresponding bits in Ff to be set to 1.<br>     * <li>clrfflags - a set of flags to be cleared (turned off) in the Ff entry of the form's corresponding     * field dictionary. Bits equal to 1 cause the corresponding bits in Ff     * to be set to 0.<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, int value, int inst[]) {        if (writer == null)            throw new RuntimeException("This AcroFields instance is read-only.");        Item item = (Item)fields.get(field);        if (item == null)            return false;        InstHit hit = new InstHit(inst);        if (name.equalsIgnoreCase("flags")) {            PdfNumber num = new PdfNumber(value);            for (int k = 0; k < item.merged.size(); ++k) {                if (hit.isHit(k)) {                    ((PdfDictionary)item.merged.get(k)).put(PdfName.F, num);                    ((PdfDictionary)item.widgets.get(k)).put(PdfName.F, num);                    markUsed((PdfDictionary)item.widgets.get(k));                }            }        }        else if (name.equalsIgnoreCase("setflags")) {            for (int k = 0; k < item.merged.size(); ++k) {                if (hit.isHit(k)) {                    PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.widgets.get(k)).get(PdfName.F));                    int val = 0;                    if (num != null)                        val = num.intValue();                    num = new PdfNumber(val | value);                    ((PdfDictionary)item.merged.get(k)).put(PdfName.F, num);                    ((PdfDictionary)item.widgets.get(k)).put(PdfName.F, num);                    markUsed((PdfDictionary)item.widgets.get(k));                }            }        }        else if (name.equalsIgnoreCase("clrflags")) {            for (int k = 0; k < item.merged.size(); ++k) {                if (hit.isHit(k)) {                    PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.widgets.get(k)).get(PdfName.F));                    int val = 0;                    if (num != null)                        val = num.intValue();                    num = new PdfNumber(val & (~value));                    ((PdfDictionary)item.merged.get(k)).put(PdfName.F, num);                    ((PdfDictionary)item.widgets.get(k)).put(PdfName.F, num);                    markUsed((PdfDictionary)item.widgets.get(k));                }            }        }        else if (name.equalsIgnoreCase("fflags")) {            PdfNumber num = new PdfNumber(value);            for (int k = 0; k < item.merged.size(); ++k) {                if (hit.isHit(k)) {                    ((PdfDictionary)item.merged.get(k)).put(PdfName.FF, num);                    ((PdfDictionary)item.values.get(k)).put(PdfName.FF, num);                    markUsed((PdfDictionary)item.values.get(k));                }            }        }        else if (name.equalsIgnoreCase("setfflags")) {            for (int k = 0; k < item.merged.size(); ++k) {                if (hit.isHit(k)) {                    PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.values.get(k)).get(PdfName.FF));                    int val = 0;                    if (num != null)                        val = num.intValue();                    num = new PdfNumber(val | value);                    ((PdfDictionary)item.merged.get(k)).put(PdfName.FF, num);                    ((PdfDictionary)item.values.get(k)).put(PdfName.FF, num);                    markUsed((PdfDictionary)item.values.get(k));                }            }        }        else if (name.equalsIgnoreCase("clrfflags")) {            for (int k = 0; k < item.merged.size(); ++k) {                if (hit.isHit(k)) {                    PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.values.get(k)).get(PdfName.FF));                    int val = 0;                    if (num != null)                        val = num.intValue();                    num = new PdfNumber(val & (~value));                    ((PdfDictionary)item.merged.get(k)).put(PdfName.FF, num);                    ((PdfDictionary)item.values.get(k)).put(PdfName.FF, num);                    markUsed((PdfDictionary)item.values.get(k));                }            }        }        else            return false;        return true;    }        /**     * Merges an XML data structure into this form.     * @param n the top node of the data structure     * @throws java.io.IOException on error     * @throws com.lowagie.text.DocumentException o error     */    public void mergeXfaData(Node n) throws IOException, DocumentException {        XfaForm.Xml2SomDatasets data = new XfaForm.Xml2SomDatasets(n);        for (Iterator it = data.getOrder().iterator(); it.hasNext();) {            String name = (String)it.next();            String text = XfaForm.getNodeText((Node)data.getName2Node().get(name));            setField(name, text);        }    }        /** Sets the fields by FDF merging.     * @param fdf the FDF form     * @throws IOException on error     * @throws DocumentException on error     */        public void setFields(FdfReader fdf) throws IOException, DocumentException {        HashMap fd = fdf.getFields();        for (Iterator i = fd.keySet().iterator(); i.hasNext();) {            String f = (String)i.next();            String v = fdf.getFieldValue(f);            if (v != null)                setField(f, v);        }    }        /** Sets the fields by XFDF merging.     * @param xfdf the XFDF form     * @throws IOException on error     * @throws DocumentException on error     */        public void setFields(XfdfReader xfdf) throws IOException, DocumentException {        HashMap fd = xfdf.getFields();        for (Iterator i = fd.keySet().iterator(); i.hasNext();) {            String f = (String)i.next();            String v = xfdf.getFieldValue(f);            if (v != null)

⌨️ 快捷键说明

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