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 + -
显示快捷键?