📄 acrofields.java
字号:
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);
}
}
}
}
}
//rotation, border and backgound 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;
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);
else
tx.setVisibility(BaseField.VISIBLE_BUT_DOES_NOT_PRINT);
}
//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());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -