Hi all,
I've notice a strange behaviour signing an existing invisible signature
field. I've noticed that the field was created multiple times every time i
try to sign it.
I think is due to preClose method that is based on a wrong condition that
recreate the field if the field passed is invisible
boolean fieldExists = !(isInvisible() || isNewField());
> PdfIndirectReference refSig = writer.getPdfIndirectReference();
> writer.setSigFlags(3);
> PdfDictionary fieldLock = null;
> if (fieldExists) { //<--- This create the problem
> PdfDictionary widget = af.getFieldItem(name).getWidget(0);
> writer.markUsed(widget);
> fieldLock = widget.getAsDict(PdfName.LOCK);
> widget.put(PdfName.P, writer.getPageReference(getPage()));
> widget.put(PdfName.V, refSig);
> PdfObject obj =
> PdfReader.getPdfObjectRelease(widget.get(PdfName.F));
> int flags = 0;
> if (obj != null && obj.isNumber())
> flags = ((PdfNumber)obj).intValue();
> flags |= PdfAnnotation.FLAGS_LOCKED;
> widget.put(PdfName.F, new PdfNumber(flags));
> PdfDictionary ap = new PdfDictionary();
> ap.put(PdfName.N, getAppearance().getIndirectReference());
> widget.put(PdfName.AP, ap);
> }
> else {
> PdfFormField sigField = PdfFormField.createSignature(writer);
> sigField.setFieldName(name);
> sigField.put(PdfName.V, refSig);
> sigField.setFlags(PdfAnnotation.FLAGS_PRINT |
> PdfAnnotation.FLAGS_LOCKED);
> int pagen = getPage();
> if (!isInvisible())
> sigField.setWidget(getPageRect(), null);
> else
> sigField.setWidget(new Rectangle(0, 0), null);
> sigField.setAppearance(PdfAnnotation.APPEARANCE_NORMAL,
> getAppearance());
> sigField.setPage(pagen);
> writer.addAnnotation(sigField, pagen);
> }
Why not use this below?
> if (!isNewField()) { //condition changed to evicting create a
> new signature field
> PdfDictionary widget = af.getFieldItem(name).getWidget(0);
> writer.markUsed(widget);
> widget.put(PdfName.P, writer.getPageReference(getPage()));
> widget.put(PdfName.V, refSig);
> PdfObject obj =
> PdfReader.getPdfObjectRelease(widget.get(PdfName.F));
> int flags = 0;
> if (obj != null && obj.isNumber())
> flags = ((PdfNumber)obj).intValue();
> flags |= PdfAnnotation.FLAGS_LOCKED;
> widget.put(PdfName.F, new PdfNumber(flags));
> if (!isInvisible()) { //link widget appereance only if is
> visible
> PdfDictionary ap = new PdfDictionary();
> ap.put(PdfName.N, getAppearance().getIndirectReference());
> widget.put(PdfName.AP, ap);
> }
> }
> else {
> PdfFormField sigField = PdfFormField.createSignature(writer);
> sigField.setFieldName(name);
> sigField.put(PdfName.V, refSig);
> sigField.setFlags(PdfAnnotation.FLAGS_PRINT |
> PdfAnnotation.FLAGS_LOCKED);
> int pagen = getPage();
> if (!isInvisible())
> sigField.setWidget(getPageRect(), null);
> else
> sigField.setWidget(new Rectangle(0, 0), null);
> sigField.setAppearance(PdfAnnotation.APPEARANCE_NORMAL,
> getAppearance());
> sigField.setPage(pagen);
> writer.addAnnotation(sigField, pagen);
> }
Thanks in advance
Emanuele
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134791&iu=/4140/ostg.clktrk
_______________________________________________
iText-questions mailing list
iText-questions@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/itext-questions
iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php