Hi, > Am 31.07.2017 um 14:10 schrieb Gary Grosso <gary.gro...@oberontech.com>: > > Perhaps I should have mentioned that I can get the other events to trigger an > alert. My problem is not being able to set a value with "event.value=".
I havn't looked at the code but quickly compared the PDFs. The non Acrobat version is missing the entries for the calculation order /CO entry on AcroForm level. BR Maruan > > -----Original Message----- > From: Gary Grosso [mailto:gary.gro...@oberontech.com] > Sent: Monday, July 31, 2017 12:33 AM > To: users@pdfbox.apache.org > Subject: calculating a field with a JavaScript action > > I would greatly appreciate any help with this endeavor. > > I have a document with 3 textboxes and I'm trying to set the value of the 3rd > with the sum of the first 2. > > My resulting PDF is at http://aapro.net/PDF/actionTestOnChangeElsewhere.pdf. > > A PDF created is at http://aapro.net/PDF/actionTestAcrobatCalculated.pdf. > > The two are pretty similar. > > Perhaps someone can point out what is the significant difference between the > two, or the error in my code, below. > > There is another possibility, that my PDF file is somehow invalid, which > makes anything I do inadequate. > > Anyway, I'll be grateful for any advice. > > public static void addTextboxAtRect(PDPage page, PDAcroForm acroForm, > String name, Map<String, String> optionMap, PDRectangle rect) { > System.out.println("addTextboxAtRect(" + name + ", " + rect.toString() > + ")"); > PDTextField textBox = new PDTextField(acroForm); > > // Ideally we would make sure each name is unique. > String nameStr = name; > textBox.setPartialName(nameStr); > > String tip = optionMap.get("tip"); > if ((tip != null) && !tip.isEmpty()) { > textBox.setAlternateFieldName(tip); > } > if (Utils.isTrue(optionMap.get("nospell"))) { > textBox.setDoNotSpellCheck(true); > } > if (Utils.isTrue(optionMap.get("ro"))) { > textBox.setReadOnly(true); > } > if (Utils.isTrue(optionMap.get("req"))) { > textBox.setRequired(true); > } > int maxlen = Utils.getInt(optionMap.get("maxlen")); > if (maxlen > -1) { > textBox.setMaxLen(maxlen); > } > > String defaultAppearanceString = "/" + > Utils.fntStr(optionMap.get("fnt")) + " " > + Utils.fszStr(optionMap.get("fsz")) + " Tf " + > Utils.hexToRgb(optionMap.get("fclr")) + " rg"; > System.out.println("defaultAppearanceString=" + > defaultAppearanceString); > textBox.setDefaultAppearance(defaultAppearanceString); > // add the field to the acroform > acroForm.getFields().add(textBox); > > // Specify the annotation associated with the field > PDAnnotationWidget widget = textBox.getWidgets().get(0); > widget.setRectangle(rect); > if (rect.getHeight() < MIN_RECT_HEIGHT) { > float diff = MIN_RECT_HEIGHT - rect.getHeight(); > rect.setLowerLeftY((float) (rect.getLowerLeftY() - diff/2.0)); > rect.setUpperRightY((float) (rect.getUpperRightY() + diff/2.0)); > } > widget.setPage(page); > > > COSDictionary apNDict = new COSDictionary(); > > apNDict.setItem(COSName.BBOX, rect); > apNDict.setItem(COSName.FORMTYPE, COSInteger.ONE); > apNDict.setItem(COSName.TYPE, COSName.XOBJECT); > apNDict.setItem(COSName.SUBTYPE, COSName.FORM); > > PDAppearanceDictionary appearance = new PDAppearanceDictionary(); > PDAppearanceEntry appearanceNEntry = new > PDAppearanceEntry(apNDict); > > appearance.setNormalAppearance(appearanceNEntry); > > widget.setAppearance(appearance); > > > PDFormFieldAdditionalActions fieldActions = new > PDFormFieldAdditionalActions(); > PDAnnotationAdditionalActions annotationActions = new > PDAnnotationAdditionalActions(); > setWidgetActions(optionMap, fieldActions, annotationActions); > widget.setActions(annotationActions); > > PDAppearanceCharacteristicsDictionary fieldAppearance > = new PDAppearanceCharacteristicsDictionary(new > COSDictionary()); > > fieldAppearance.setBorderColour(Utils.hexToPDColor(optionMap.get("brdclr"))); > > fieldAppearance.setBackground(Utils.hexToPDColor(optionMap.get("bclr"))); > widget.setAppearanceCharacteristics(fieldAppearance); > > PDField field = acroForm.getField(nameStr); > > field.getActions().getCOSObject().addAll(fieldActions.getCOSObject()); > > // make sure the annotation is visible on screen and paper > widget.setPrinted(true); > // Add the annotation to the page > try { > page.getAnnotations().add(widget); > } catch (IOException e) { > e.printStackTrace(); > } > String dflt = Utils.unescapeChar(optionMap.get("dflt")); > if ((dflt != null) && !dflt.isEmpty()) { > try { > textBox.setValue(dflt); > } catch (IOException e) { > e.printStackTrace(); > } > } > } > > private static void setWidgetActions(Map<String, String> optionMap, > PDFormFieldAdditionalActions fieldActions, PDAnnotationAdditionalActions > annotationActions) { > if ((optionMap.get("js") != null) && !optionMap.get("js").isEmpty()) { > String[] jsStrings = optionMap.get("js").split("\\|"); > String[] evts = optionMap.get("evt").split("\\|"); > for (int ix = 0 ; ix < jsStrings.length ; ix++) { > String jsString = jsStrings[ix]; > String evt = evts[ix]; // jsStrings and evts are assumed to > be parallel arrays > PDActionJavaScript jsAction = new PDActionJavaScript(); > //Creating PDActionJavaScript object > jsAction.setAction(Utils.decodeJsString(jsString)); > System.out.println(jsAction.getAction()); > if ((evt != null) && !evt.isEmpty()) { > switch (evt) { > case "onCursorEnters": > // This refers to the mouse pointer, not the typing > cursor. > annotationActions.setE(jsAction); > break; > case "onCursorExits": > // This refers to the mouse pointer, not the typing > cursor. > annotationActions.setX(jsAction); > break; > case "onFocus": > annotationActions.setFo(jsAction); > break; > case "onBlur": > /* > * This will set an action to be performed when the > annotation loses the input focus. The name Bl stands for "blurred". > */ > annotationActions.setBl(jsAction); > break; > case "onKeyPress": > fieldActions.setK(jsAction); > break; > case "onMouseDown": > annotationActions.setD(jsAction); > break; > case "onMouseUp": > annotationActions.setU(jsAction); > break; > case "onChange": > fieldActions.setF(jsAction); > break; > case "onFormat": > /* > * This will set a JavaScript action > to be performed before > * the field is formatted to display > its current value. This > * allows the field's value to be > modified before > * formatting. > */ > fieldActions.setV(jsAction); > break; > case "onPageClose": > annotationActions.setPC(jsAction); > break; > case "onPageOpen": > annotationActions.setPO(jsAction); > break; > case "onChangeElsewhere": > /* > * This will set a JavaScript action > to be performed in > * order to recalculate the value of > this field when that of > * another field changes. The order in > which the document's > * fields are recalculated is defined > by the CO entry in the > * interactive form dictionary. > */ > fieldActions.setC(jsAction); > break; > } > } > } > } > > } > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org > For additional commands, e-mail: users-h...@pdfbox.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org For additional commands, e-mail: users-h...@pdfbox.apache.org