KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > lowagie > text > pdf > PdfAcroForm


1 /*
2  * $Id: PdfAcroForm.java 2702 2007-04-20 16:18:04Z psoares33 $
3  * $Name$
4  *
5  * Copyright 2002 Bruno Lowagie
6  *
7  * The contents of this file are subject to the Mozilla Public License Version 1.1
8  * (the "License"); you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at http://www.mozilla.org/MPL/
10  *
11  * Software distributed under the License is distributed on an "AS IS" basis,
12  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13  * for the specific language governing rights and limitations under the License.
14  *
15  * The Original Code is 'iText, a free JAVA-PDF library'.
16  *
17  * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
18  * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
19  * All Rights Reserved.
20  * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
21  * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
22  *
23  * Contributor(s): all the names of the contributors are added in the source code
24  * where applicable.
25  *
26  * Alternatively, the contents of this file may be used under the terms of the
27  * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
28  * provisions of LGPL are applicable instead of those above. If you wish to
29  * allow use of your version of this file only under the terms of the LGPL
30  * License and not to allow others to use your version of this file under
31  * the MPL, indicate your decision by deleting the provisions above and
32  * replace them with the notice and other provisions required by the LGPL.
33  * If you do not delete the provisions above, a recipient may use your version
34  * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
35  *
36  * This library is free software; you can redistribute it and/or modify it
37  * under the terms of the MPL as stated above or under the terms of the GNU
38  * Library General Public License as published by the Free Software Foundation;
39  * either version 2 of the License, or any later version.
40  *
41  * This library is distributed in the hope that it will be useful, but WITHOUT
42  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
43  * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
44  * details.
45  *
46  * If you didn't download this code from the following link, you should check if
47  * you aren't using an obsolete version:
48  * http://www.lowagie.com/iText/
49  */

50
51 package com.lowagie.text.pdf;
52
53 import java.util.HashMap JavaDoc;
54 import java.util.Iterator JavaDoc;
55
56 import com.lowagie.text.ExceptionConverter;
57 import com.lowagie.text.Rectangle;
58
59 /**
60  * Each PDF document can contain maximum 1 AcroForm.
61  */

62
63 public class PdfAcroForm extends PdfDictionary {
64
65     private PdfWriter writer;
66
67
68     /** This is a map containing FieldTemplates. */
69     private HashMap JavaDoc fieldTemplates = new HashMap JavaDoc();
70
71     /** This is an array containing DocumentFields. */
72     private PdfArray documentFields = new PdfArray();
73
74     /** This is an array containing the calculationorder of the fields. */
75     private PdfArray calculationOrder = new PdfArray();
76
77     /** Contains the signature flags. */
78     private int sigFlags = 0;
79
80     /** Creates new PdfAcroForm
81      * @param writer*/

82     public PdfAcroForm(PdfWriter writer) {
83         super();
84         this.writer = writer;
85     }
86     
87     public void setNeedAppearances(boolean value) {
88         put(PdfName.NEEDAPPEARANCES, new PdfBoolean(value));
89     }
90
91     /**
92      * Adds fieldTemplates.
93      * @param ft
94      */

95
96     public void addFieldTemplates(HashMap JavaDoc ft) {
97         fieldTemplates.putAll(ft);
98     }
99
100     /**
101      * Adds documentFields.
102      * @param ref
103      */

104
105     public void addDocumentField(PdfIndirectReference ref) {
106         documentFields.add(ref);
107     }
108
109     /**
110      * Checks if the Acroform is valid
111      * @return true if the Acroform is valid
112      */

113
114     public boolean isValid() {
115         if (documentFields.size() == 0) return false;
116         put(PdfName.FIELDS, documentFields);
117         if (sigFlags != 0)
118             put(PdfName.SIGFLAGS, new PdfNumber(sigFlags));
119         if (calculationOrder.size() > 0)
120             put(PdfName.CO, calculationOrder);
121         if (fieldTemplates.isEmpty()) return true;
122         PdfDictionary dic = new PdfDictionary();
123         for (Iterator JavaDoc it = fieldTemplates.keySet().iterator(); it.hasNext();) {
124             PdfTemplate template = (PdfTemplate)it.next();
125             PdfFormField.mergeResources(dic, (PdfDictionary)template.getResources());
126         }
127         put(PdfName.DR, dic);
128         put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));
129         PdfDictionary fonts = (PdfDictionary)dic.get(PdfName.FONT);
130         if (fonts != null) {
131             writer.eliminateFontSubset(fonts);
132         }
133         return true;
134     }
135
136     /**
137      * Adds an object to the calculationOrder.
138      * @param formField
139      */

140
141     public void addCalculationOrder(PdfFormField formField) {
142         calculationOrder.add(formField.getIndirectReference());
143     }
144
145     /**
146      * Sets the signature flags.
147      * @param f
148      */

149
150     public void setSigFlags(int f) {
151         sigFlags |= f;
152     }
153
154     /**
155      * Adds a formfield to the AcroForm.
156      * @param formField
157      */

158
159     public void addFormField(PdfFormField formField) {
160         writer.addAnnotation(formField);
161     }
162
163     /**
164      * @param name
165      * @param caption
166      * @param value
167      * @param url
168      * @param font
169      * @param fontSize
170      * @param llx
171      * @param lly
172      * @param urx
173      * @param ury
174      * @return a PdfFormField
175      */

176     public PdfFormField addHtmlPostButton(String JavaDoc name, String JavaDoc caption, String JavaDoc value, String JavaDoc url, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
177         PdfAction action = PdfAction.createSubmitForm(url, null, PdfAction.SUBMIT_HTML_FORMAT);
178         PdfFormField button = new PdfFormField(writer, llx, lly, urx, ury, action);
179         setButtonParams(button, PdfFormField.FF_PUSHBUTTON, name, value);
180         drawButton(button, caption, font, fontSize, llx, lly, urx, ury);
181         addFormField(button);
182     return button;
183     }
184
185     /**
186      * @param name
187      * @param caption
188      * @param value
189      * @param font
190      * @param fontSize
191      * @param llx
192      * @param lly
193      * @param urx
194      * @param ury
195      * @return a PdfFormField
196      */

197     public PdfFormField addResetButton(String JavaDoc name, String JavaDoc caption, String JavaDoc value, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
198         PdfAction action = PdfAction.createResetForm(null, 0);
199         PdfFormField button = new PdfFormField(writer, llx, lly, urx, ury, action);
200         setButtonParams(button, PdfFormField.FF_PUSHBUTTON, name, value);
201         drawButton(button, caption, font, fontSize, llx, lly, urx, ury);
202         addFormField(button);
203         return button;
204     }
205
206     /**
207      * @param name
208      * @param value
209      * @param url
210      * @param appearance
211      * @param llx
212      * @param lly
213      * @param urx
214      * @param ury
215      * @return a PdfFormField
216      */

217     public PdfFormField addMap(String JavaDoc name, String JavaDoc value, String JavaDoc url, PdfContentByte appearance, float llx, float lly, float urx, float ury) {
218         PdfAction action = PdfAction.createSubmitForm(url, null, PdfAction.SUBMIT_HTML_FORMAT | PdfAction.SUBMIT_COORDINATES);
219         PdfFormField button = new PdfFormField(writer, llx, lly, urx, ury, action);
220         setButtonParams(button, PdfFormField.FF_PUSHBUTTON, name, null);
221         PdfAppearance pa = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
222         pa.add(appearance);
223         button.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, pa);
224         addFormField(button);
225         return button;
226     }
227
228     /**
229      * @param button
230      * @param characteristics
231      * @param name
232      * @param value
233      */

234     public void setButtonParams(PdfFormField button, int characteristics, String JavaDoc name, String JavaDoc value) {
235         button.setButton(characteristics);
236         button.setFlags(PdfAnnotation.FLAGS_PRINT);
237         button.setPage();
238         button.setFieldName(name);
239         if (value != null) button.setValueAsString(value);
240     }
241
242     /**
243      * @param button
244      * @param caption
245      * @param font
246      * @param fontSize
247      * @param llx
248      * @param lly
249      * @param urx
250      * @param ury
251      */

252     public void drawButton(PdfFormField button, String JavaDoc caption, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
253         PdfAppearance pa = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
254         pa.drawButton(0f, 0f, urx - llx, ury - lly, caption, font, fontSize);
255         button.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, pa);
256     }
257
258     /**
259      * @param name
260      * @param value
261      * @return a PdfFormField
262      */

263     public PdfFormField addHiddenField(String JavaDoc name, String JavaDoc value) {
264         PdfFormField hidden = PdfFormField.createEmpty(writer);
265         hidden.setFieldName(name);
266         hidden.setValueAsName(value);
267         addFormField(hidden);
268         return hidden;
269     }
270
271     /**
272      * @param name
273      * @param text
274      * @param font
275      * @param fontSize
276      * @param llx
277      * @param lly
278      * @param urx
279      * @param ury
280      * @return a PdfFormField
281      */

282     public PdfFormField addSingleLineTextField(String JavaDoc name, String JavaDoc text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
283         PdfFormField field = PdfFormField.createTextField(writer, PdfFormField.SINGLELINE, PdfFormField.PLAINTEXT, 0);
284         setTextFieldParams(field, text, name, llx, lly, urx, ury);
285         drawSingleLineOfText(field, text, font, fontSize, llx, lly, urx, ury);
286         addFormField(field);
287         return field;
288     }
289
290     /**
291      * @param name
292      * @param text
293      * @param font
294      * @param fontSize
295      * @param llx
296      * @param lly
297      * @param urx
298      * @param ury
299      * @return a PdfFormField
300      */

301     public PdfFormField addMultiLineTextField(String JavaDoc name, String JavaDoc text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
302         PdfFormField field = PdfFormField.createTextField(writer, PdfFormField.MULTILINE, PdfFormField.PLAINTEXT, 0);
303         setTextFieldParams(field, text, name, llx, lly, urx, ury);
304         drawMultiLineOfText(field, text, font, fontSize, llx, lly, urx, ury);
305         addFormField(field);
306         return field;
307     }
308
309     /**
310      * @param name
311      * @param text
312      * @param font
313      * @param fontSize
314      * @param llx
315      * @param lly
316      * @param urx
317      * @param ury
318      * @return PdfFormField
319      */

320     public PdfFormField addSingleLinePasswordField(String JavaDoc name, String JavaDoc text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
321         PdfFormField field = PdfFormField.createTextField(writer, PdfFormField.SINGLELINE, PdfFormField.PASSWORD, 0);
322         setTextFieldParams(field, text, name, llx, lly, urx, ury);
323         drawSingleLineOfText(field, text, font, fontSize, llx, lly, urx, ury);
324         addFormField(field);
325         return field;
326     }
327
328     /**
329      * @param field
330      * @param text
331      * @param name
332      * @param llx
333      * @param lly
334      * @param urx
335      * @param ury
336      */

337     public void setTextFieldParams(PdfFormField field, String JavaDoc text, String JavaDoc name, float llx, float lly, float urx, float ury) {
338         field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_INVERT);
339         field.setValueAsString(text);
340         field.setDefaultValueAsString(text);
341         field.setFieldName(name);
342         field.setFlags(PdfAnnotation.FLAGS_PRINT);
343         field.setPage();
344     }
345
346     /**
347      * @param field
348      * @param text
349      * @param font
350      * @param fontSize
351      * @param llx
352      * @param lly
353      * @param urx
354      * @param ury
355      */

356     public void drawSingleLineOfText(PdfFormField field, String JavaDoc text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
357         PdfAppearance tp = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
358         PdfAppearance tp2 = (PdfAppearance)tp.getDuplicate();
359         tp2.setFontAndSize(font, fontSize);
360         tp2.resetRGBColorFill();
361         field.setDefaultAppearanceString(tp2);
362         tp.drawTextField(0f, 0f, urx - llx, ury - lly);
363         tp.beginVariableText();
364         tp.saveState();
365         tp.rectangle(3f, 3f, urx - llx - 6f, ury - lly - 6f);
366         tp.clip();
367         tp.newPath();
368         tp.beginText();
369         tp.setFontAndSize(font, fontSize);
370         tp.resetRGBColorFill();
371         tp.setTextMatrix(4, (ury - lly) / 2 - (fontSize * 0.3f));
372         tp.showText(text);
373         tp.endText();
374         tp.restoreState();
375         tp.endVariableText();
376         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
377     }
378
379     /**
380      * @param field
381      * @param text
382      * @param font
383      * @param fontSize
384      * @param llx
385      * @param lly
386      * @param urx
387      * @param ury
388      */

389     public void drawMultiLineOfText(PdfFormField field, String JavaDoc text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
390         PdfAppearance tp = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
391         PdfAppearance tp2 = (PdfAppearance)tp.getDuplicate();
392         tp2.setFontAndSize(font, fontSize);
393         tp2.resetRGBColorFill();
394         field.setDefaultAppearanceString(tp2);
395         tp.drawTextField(0f, 0f, urx - llx, ury - lly);
396         tp.beginVariableText();
397         tp.saveState();
398         tp.rectangle(3f, 3f, urx - llx - 6f, ury - lly - 6f);
399         tp.clip();
400         tp.newPath();
401         tp.beginText();
402         tp.setFontAndSize(font, fontSize);
403         tp.resetRGBColorFill();
404         tp.setTextMatrix(4, 5);
405         java.util.StringTokenizer JavaDoc tokenizer = new java.util.StringTokenizer JavaDoc(text, "\n");
406         float yPos = ury - lly;
407         while (tokenizer.hasMoreTokens()) {
408             yPos -= fontSize * 1.2f;
409             tp.showTextAligned(PdfContentByte.ALIGN_LEFT, tokenizer.nextToken(), 3, yPos, 0);
410         }
411         tp.endText();
412         tp.restoreState();
413         tp.endVariableText();
414         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
415     }
416
417     /**
418      * @param name
419      * @param value
420      * @param status
421      * @param llx
422      * @param lly
423      * @param urx
424      * @param ury
425      * @return a PdfFormField
426      */

427     public PdfFormField addCheckBox(String JavaDoc name, String JavaDoc value, boolean status, float llx, float lly, float urx, float ury) {
428         PdfFormField field = PdfFormField.createCheckBox(writer);
429         setCheckBoxParams(field, name, value, status, llx, lly, urx, ury);
430         drawCheckBoxAppearences(field, value, llx, lly, urx, ury);
431         addFormField(field);
432         return field;
433     }
434
435     /**
436      * @param field
437      * @param name
438      * @param value
439      * @param status
440      * @param llx
441      * @param lly
442      * @param urx
443      * @param ury
444      */

445     public void setCheckBoxParams(PdfFormField field, String JavaDoc name, String JavaDoc value, boolean status, float llx, float lly, float urx, float ury) {
446         field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_TOGGLE);
447         field.setFieldName(name);
448         if (status) {
449             field.setValueAsName(value);
450             field.setAppearanceState(value);
451         }
452         else {
453             field.setValueAsName("Off");
454             field.setAppearanceState("Off");
455         }
456         field.setFlags(PdfAnnotation.FLAGS_PRINT);
457         field.setPage();
458         field.setBorderStyle(new PdfBorderDictionary(1, PdfBorderDictionary.STYLE_SOLID));
459     }
460
461     /**
462      * @param field
463      * @param value
464      * @param llx
465      * @param lly
466      * @param urx
467      * @param ury
468      */

469     public void drawCheckBoxAppearences(PdfFormField field, String JavaDoc value, float llx, float lly, float urx, float ury) {
470         BaseFont font = null;
471         try {
472             font = BaseFont.createFont(BaseFont.ZAPFDINGBATS, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
473         }
474         catch(Exception JavaDoc e) {
475             throw new ExceptionConverter(e);
476         }
477         float size = (ury - lly);
478         PdfAppearance tpOn = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
479         PdfAppearance tp2 = (PdfAppearance)tpOn.getDuplicate();
480         tp2.setFontAndSize(font, size);
481         tp2.resetRGBColorFill();
482         field.setDefaultAppearanceString(tp2);
483         tpOn.drawTextField(0f, 0f, urx - llx, ury - lly);
484         tpOn.saveState();
485         tpOn.resetRGBColorFill();
486         tpOn.beginText();
487         tpOn.setFontAndSize(font, size);
488         tpOn.showTextAligned(PdfContentByte.ALIGN_CENTER, "4", (urx - llx) / 2, (ury - lly) / 2 - (size * 0.3f), 0);
489         tpOn.endText();
490         tpOn.restoreState();
491         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, value, tpOn);
492         PdfAppearance tpOff = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
493         tpOff.drawTextField(0f, 0f, urx - llx, ury - lly);
494         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", tpOff);
495     }
496
497     /**
498      * @param name
499      * @param defaultValue
500      * @param noToggleToOff
501      * @return a PdfFormField
502      */

503     public PdfFormField getRadioGroup(String JavaDoc name, String JavaDoc defaultValue, boolean noToggleToOff) {
504         PdfFormField radio = PdfFormField.createRadioButton(writer, noToggleToOff);
505         radio.setFieldName(name);
506         radio.setValueAsName(defaultValue);
507         return radio;
508     }
509
510     /**
511      * @param radiogroup
512      */

513     public void addRadioGroup(PdfFormField radiogroup) {
514         addFormField(radiogroup);
515     }
516
517     /**
518      * @param radiogroup
519      * @param value
520      * @param llx
521      * @param lly
522      * @param urx
523      * @param ury
524      * @return a PdfFormField
525      */

526     public PdfFormField addRadioButton(PdfFormField radiogroup, String JavaDoc value, float llx, float lly, float urx, float ury) {
527         PdfFormField radio = PdfFormField.createEmpty(writer);
528         radio.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_TOGGLE);
529         String JavaDoc name = ((PdfName)radiogroup.get(PdfName.V)).toString().substring(1);
530         if (name.equals(value)) {
531             radio.setAppearanceState(value);
532         }
533         else {
534             radio.setAppearanceState("Off");
535         }
536         drawRadioAppearences(radio, value, llx, lly, urx, ury);
537         radiogroup.addKid(radio);
538         return radio;
539     }
540
541     /**
542      * @param field
543      * @param value
544      * @param llx
545      * @param lly
546      * @param urx
547      * @param ury
548      */

549     public void drawRadioAppearences(PdfFormField field, String JavaDoc value, float llx, float lly, float urx, float ury) {
550         PdfAppearance tpOn = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
551         tpOn.drawRadioField(0f, 0f, urx - llx, ury - lly, true);
552         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, value, tpOn);
553         PdfAppearance tpOff = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
554         tpOff.drawRadioField(0f, 0f, urx - llx, ury - lly, false);
555         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", tpOff);
556     }
557
558     /**
559      * @param name
560      * @param options
561      * @param defaultValue
562      * @param font
563      * @param fontSize
564      * @param llx
565      * @param lly
566      * @param urx
567      * @param ury
568      * @return a PdfFormField
569      */

570     public PdfFormField addSelectList(String JavaDoc name, String JavaDoc[] options, String JavaDoc defaultValue, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
571         PdfFormField choice = PdfFormField.createList(writer, options, 0);
572         setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
573         StringBuffer JavaDoc text = new StringBuffer JavaDoc();
574         for (int i = 0; i < options.length; i++) {
575             text.append(options[i]).append('\n');
576         }
577         drawMultiLineOfText(choice, text.toString(), font, fontSize, llx, lly, urx, ury);
578         addFormField(choice);
579         return choice;
580     }
581
582     /**
583      * @param name
584      * @param options
585      * @param defaultValue
586      * @param font
587      * @param fontSize
588      * @param llx
589      * @param lly
590      * @param urx
591      * @param ury
592      * @return a PdfFormField
593      */

594     public PdfFormField addSelectList(String JavaDoc name, String JavaDoc[][] options, String JavaDoc defaultValue, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
595         PdfFormField choice = PdfFormField.createList(writer, options, 0);
596         setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
597         StringBuffer JavaDoc text = new StringBuffer JavaDoc();
598         for (int i = 0; i < options.length; i++) {
599             text.append(options[i][1]).append('\n');
600         }
601         drawMultiLineOfText(choice, text.toString(), font, fontSize, llx, lly, urx, ury);
602         addFormField(choice);
603         return choice;
604     }
605
606     /**
607      * @param name
608      * @param options
609      * @param defaultValue
610      * @param editable
611      * @param font
612      * @param fontSize
613      * @param llx
614      * @param lly
615      * @param urx
616      * @param ury
617      * @return a PdfFormField
618      */

619     public PdfFormField addComboBox(String JavaDoc name, String JavaDoc[] options, String JavaDoc defaultValue, boolean editable, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
620         PdfFormField choice = PdfFormField.createCombo(writer, editable, options, 0);
621         setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
622         if (defaultValue == null) {
623             defaultValue = options[0];
624         }
625         drawSingleLineOfText(choice, defaultValue, font, fontSize, llx, lly, urx, ury);
626         addFormField(choice);
627         return choice;
628     }
629
630     /**
631      * @param name
632      * @param options
633      * @param defaultValue
634      * @param editable
635      * @param font
636      * @param fontSize
637      * @param llx
638      * @param lly
639      * @param urx
640      * @param ury
641      * @return a PdfFormField
642      */

643     public PdfFormField addComboBox(String JavaDoc name, String JavaDoc[][] options, String JavaDoc defaultValue, boolean editable, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
644         PdfFormField choice = PdfFormField.createCombo(writer, editable, options, 0);
645         setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
646         String JavaDoc value = null;
647         for (int i = 0; i < options.length; i++) {
648             if (options[i][0].equals(defaultValue)) {
649                 value = options[i][1];
650                 break;
651             }
652         }
653         if (value == null) {
654             value = options[0][1];
655         }
656         drawSingleLineOfText(choice, value, font, fontSize, llx, lly, urx, ury);
657         addFormField(choice);
658         return choice;
659     }
660
661     /**
662      * @param field
663      * @param name
664      * @param defaultValue
665      * @param llx
666      * @param lly
667      * @param urx
668      * @param ury
669      */

670     public void setChoiceParams(PdfFormField field, String JavaDoc name, String JavaDoc defaultValue, float llx, float lly, float urx, float ury) {
671         field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_INVERT);
672         if (defaultValue != null) {
673             field.setValueAsString(defaultValue);
674             field.setDefaultValueAsString(defaultValue);
675         }
676         field.setFieldName(name);
677         field.setFlags(PdfAnnotation.FLAGS_PRINT);
678         field.setPage();
679         field.setBorderStyle(new PdfBorderDictionary(2, PdfBorderDictionary.STYLE_SOLID));
680     }
681
682     /**
683      * @param name
684      * @param llx
685      * @param lly
686      * @param urx
687      * @param ury
688      * @return a PdfFormField
689      */

690     public PdfFormField addSignature(String JavaDoc name,
691                     float llx, float lly, float urx, float ury) {
692         PdfFormField signature = PdfFormField.createSignature(writer);
693         setSignatureParams(signature, name, llx, lly, urx, ury);
694         drawSignatureAppearences(signature, llx, lly, urx, ury);
695         addFormField(signature);
696         return signature;
697     }
698     
699     /**
700      * @param field
701      * @param name
702      * @param llx
703      * @param lly
704      * @param urx
705      * @param ury
706      */

707     public void setSignatureParams(PdfFormField field, String JavaDoc name,
708                     float llx, float lly, float urx, float ury) {
709         field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_INVERT);
710         field.setFieldName(name);
711         field.setFlags(PdfAnnotation.FLAGS_PRINT);
712         field.setPage();
713         field.setMKBorderColor(java.awt.Color.black);
714         field.setMKBackgroundColor(java.awt.Color.white);
715     }
716
717     /**
718      * @param field
719      * @param llx
720      * @param lly
721      * @param urx
722      * @param ury
723      */

724     public void drawSignatureAppearences(PdfFormField field,
725                     float llx, float lly, float urx, float ury) {
726         PdfAppearance tp = PdfAppearance.createAppearance(writer, urx - llx, ury - lly);
727         tp.setGrayFill(1.0f);
728         tp.rectangle(0, 0, urx - llx, ury - lly);
729         tp.fill();
730         tp.setGrayStroke(0);
731         tp.setLineWidth(1);
732         tp.rectangle(0.5f, 0.5f, urx - llx - 0.5f, ury - lly - 0.5f);
733         tp.closePathStroke();
734         tp.saveState();
735         tp.rectangle(1, 1, urx - llx - 2, ury - lly - 2);
736         tp.clip();
737         tp.newPath();
738         tp.restoreState();
739         field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
740     }
741 }
Popular Tags