Hi Michael!

We also need a quick fix to the problem - as we do not need any
functionality but Signature verification, we do not change the PDf and hence
will not have problems with PdfStamper and PdfCopy* classes. Would it be
possible to send me the codding of your hepler method?

kr Don



mkl wrote:
> 
> Hello,
> 
> I happened to come across signatures just like the one Andreas Kühne
> posted in September. As I need to be able to handle these signatures
> fairly soon (at least it looks like a greater hassle to persuade my users
> not to use the secunet application that creates these signatures), I
> created a small helper method that adds these signature fields not
> referenced in the annotation arrays of the document pages; this helper has
> to be applied to an AcroFields instance right after getting it from the
> PdfReader. Essentially it replaces the data collected by AcroFields.fill()
> with an extended set of fields in a way inspired by the that very method. 
> 
> It seems to work alright in my first tests, even though there might be
> some object releasing still to do; and obviously the duplicate code inside
> that method is not artful coding.
> 
> Primarily I do wonder, though, whether iText might have any trouble when
> later confronted with these additional entries among its fields,
> especially considering the PdfStamper and PdfCopy* classes when writing
> derived PDF documents.
> 
> Regards,   Michael.
> 
> 
> Paulo Soares <psoares <at> glintt.com> writes:
> 
>> I'm not sure if this is a bug from iText but this things appear now and
>> then and,
>> like it or not, if it works in Acrobat it must be right. I'll "fix" it.
>> 
>> Paulo
>> 
>> > -----Original Message-----
>> > From: itext-questions-bounces <at> lists.sourceforge.net
>> > [mailto:itext-questions-bounces <at> lists.sourceforge.net] On
>> > Behalf Of Andreas Kuehne
>> > Sent: Tuesday, September 09, 2008 4:08 PM
>> > To: Post all your questions about iText here
>> > Subject: [iText-questions] Signature not found : Bug or feature ?
>> >
>> > Hi,
>> >
>> > I'm not sure whether I'm going to submit a bug or request a
>> > new feature :
>> >
>> > The AcroFields class has method returning all signatures (
>> > getSignatureNames() ).
>> >
>> > Now I came across a pdf with a signature that doesn't get
>> > returned by getSignatureNames(). On the other hand the
>> > Acrobat Reader shows the signature without any problems.
>> >
>> > Analyzing the code shows that AcroFields are expected to be
>> > related to a page. But the signature doesn't !
>> > So my question is :
>> >
>> > Is it a bug to expect every signature to be assigned to a
>> > page ( what isn't neccessarily so ) ?
>> > Or do AcroFields are expected to be page-related 'by nature',
>> > so my signature is just no AcroField and I must look for
>> > another way to retrieve the signature ?
>> >
>> > The problematic signed PDF is attached.
>> >
>> > Opinions welcome
>> >
>> > Andreas
> 
> -- 
> "Feel free" - 10 GB Mailbox, 100 FreeSMS/Monat ...
> Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail
> 
> /* $Id:$
>  */
> package com.lowagie.text.pdf;
> 
> import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.Map;
> 
> import com.lowagie.text.pdf.AcroFields.Item;
> 
> public class AcroFieldsHelper
> {
>     public static void fill(AcroFields acroFields) {
>         acroFields.fields = new HashMap();
>         PdfDictionary top =
> (PdfDictionary)PdfReader.getPdfObjectRelease(acroFields.reader.getCatalog().get(PdfName.ACROFORM));
>         if (top == null)
>             return;
>         PdfArray arrfds =
> (PdfArray)PdfReader.getPdfObjectRelease(top.get(PdfName.FIELDS));
>         if (arrfds == null || arrfds.size() == 0)
>             return;
>         Map fields = collectFields(arrfds, null);
>         System.out.println("Acrofields found: " + fields);
>         arrfds = null;
>         for (int k = 1; k <= acroFields.reader.getNumberOfPages(); ++k) {
>             PdfDictionary page = acroFields.reader.getPageNRelease(k);
>             PdfArray annots =
> (PdfArray)PdfReader.getPdfObjectRelease(page.get(PdfName.ANNOTS), page);
>             if (annots == null)
>                 continue;
>             ArrayList arr = annots.getArrayList();
>             for (int j = 0; j < arr.size(); ++j) {
>                 System.out.println("\nAnnotation " + arr.get(j));
>                 PdfObject annoto =
> PdfReader.getPdfObject((PdfObject)arr.get(j), annots);
>                 if (!(annoto instanceof PdfDictionary)) {
>                    
> PdfReader.releaseLastXrefPartial((PdfObject)arr.get(j));
>                     continue;
>                 }
>                 PdfDictionary annot = (PdfDictionary)annoto;
>                 if (!PdfName.WIDGET.equals(annot.get(PdfName.SUBTYPE))) {
>                    
> PdfReader.releaseLastXrefPartial((PdfObject)arr.get(j));
>                     continue;
>                 }
>                 PdfDictionary widget = annot;
>                 PdfDictionary dic = new PdfDictionary();
>                 dic.putAll(annot);
>                 String name = "";
>                 PdfDictionary value = null;
>                 PdfObject lastV = null;
>                 while (annot != null) {
>                     dic.mergeDifferent(annot);
>                     PdfString t =
> (PdfString)PdfReader.getPdfObject(annot.get(PdfName.T));
>                     if (t != null)
>                         name = t.toUnicodeString() + "." + name;
>                     if (lastV == null && annot.get(PdfName.V) != null)
>                         lastV =
> PdfReader.getPdfObjectRelease(annot.get(PdfName.V));
>                     if (value == null &&  t != null) {
>                         value = annot;
>                         if (annot.get(PdfName.V) == null && lastV  !=
> null)
>                             value.put(PdfName.V, lastV);
>                     }
>                     PdfObject parent = annot.get(PdfName.PARENT);
>                     if (parent instanceof PdfIndirectReference)
>                     {
>                         System.out.println(" has parent " + parent);
>                         Integer number = new
> Integer(((PdfIndirectReference)parent).getNumber());
>                         fields.remove(number);
>                     }
>                     annot = (PdfDictionary)PdfReader.getPdfObject(parent,
> annot);
>                 }
>                 if (name.length() > 0)
>                     name = name.substring(0, name.length() - 1);
>                 Item item = (Item)acroFields.fields.get(name);
>                 if (item == null) {
>                     item = new Item();
>                     acroFields.fields.put(name, item);
>                 }
>                 if (value == null)
>                     item.values.add(widget);
>                 else
>                     item.values.add(value);
>                 item.widgets.add(widget);
>                 item.widget_refs.add(arr.get(j)); // must be a reference
>                 if (top != null)
>                     dic.mergeDifferent(top);
>                 item.merged.add(dic);
>                 item.page.add(new Integer(k));
>                 item.tabOrder.add(new Integer(j));
>             }
>         }
>         System.out.println("Acrofields unaccounted for: " + fields);
>         for(Iterator itUnbound = fields.entrySet().iterator();
> itUnbound.hasNext(); )
>         {
>             Map.Entry unboundEntry = (Map.Entry)itUnbound.next();
>             System.out.println("\nUnbound " + unboundEntry.getValue());
>             PdfDictionary field = (PdfDictionary)
> PdfReader.getPdfObject((PdfObject) unboundEntry.getValue());
>             PdfDictionary dic = new PdfDictionary();
>             dic.putAll(field);
>             String name = "";
>             PdfDictionary value = null;
>             PdfObject lastV = null;
>             while (field != null) {
>                 dic.mergeDifferent(field);
>                 PdfString t =
> (PdfString)PdfReader.getPdfObject(field.get(PdfName.T));
>                 if (t != null)
>                     name = t.toUnicodeString() + "." + name;
>                 if (lastV == null && field.get(PdfName.V) != null)
>                     lastV =
> PdfReader.getPdfObjectRelease(field.get(PdfName.V));
>                 if (value == null &&  t != null) {
>                     value = field;
>                     if (field.get(PdfName.V) == null && lastV  != null)
>                         value.put(PdfName.V, lastV);
>                 }
>                 PdfObject parent = field.get(PdfName.PARENT);
>                 if (parent instanceof PdfIndirectReference)
>                 {
>                     System.out.println(" has parent " + parent);
>                     Integer number = new
> Integer(((PdfIndirectReference)parent).getNumber());
>                     fields.remove(number);
>                 }
>                 field = (PdfDictionary)PdfReader.getPdfObject(parent,
> field);
>             }
>             if (name.length() > 0)
>                 name = name.substring(0, name.length() - 1);
>             Item item = (Item)acroFields.fields.get(name);
>             if (item == null) {
>                 item = new Item();
>                 acroFields.fields.put(name, item);
>             }
>             if (value == null)
>                 item.values.add(field);
>             else
>                 item.values.add(value);
>             item.widgets.add(field);
>             item.widget_refs.add(unboundEntry.getValue()); // must be a
> reference
>             if (top != null)
>                 dic.mergeDifferent(top);
>             item.merged.add(dic);
>             item.page.add(new Integer(-1));
>             item.tabOrder.add(new Integer(-1));
>         }
>     }
> 
>     
>     
>     static Map collectFields(PdfArray pdfArray, Map fields)
>     {
>         if (fields == null)
>             fields = new HashMap();
>         
>         for (int j = 0; j < pdfArray.size(); ++j) {
>             PdfIndirectReference fieldReference =
> pdfArray.getAsIndirectObject(j);
>             Integer number = new Integer(fieldReference.getNumber());
>             if (!fields.containsKey(number))
>             {
>                 fields.put(number, fieldReference);
>                 PdfDictionary field = (PdfDictionary)
> PdfReader.getPdfObjectRelease(fieldReference);
>                 PdfArray contained =
> (PdfArray)PdfReader.getPdfObjectRelease(field.get(PdfName.FIELDS));
>                 if (contained != null)
>                     fields = collectFields(contained, fields);
>             }
>         }
>         
>         return fields;
>     }
> }
> 
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's
> challenge
> Build the coolest Linux based applications with Moblin SDK & win great
> prizes
> Grand prize is a trip for two to an Open Source event anywhere in the
> world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> iText-questions mailing list
> iText-questions@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/itext-questions
> 
> Buy the iText book: http://www.1t3xt.com/docs/book.php
> 

-- 
View this message in context: 
http://www.nabble.com/Re%3A-Signature-not-found-%3A-Bug-or-feature---tp20382425p23636117.html
Sent from the iText - General mailing list archive at Nabble.com.


------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables 
unlimited royalty-free distribution of the report engine 
for externally facing server and web deployment. 
http://p.sf.net/sfu/businessobjects
_______________________________________________
iText-questions mailing list
iText-questions@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/itext-questions

Buy the iText book: http://www.1t3xt.com/docs/book.php
Check the site with examples before you ask questions: 
http://www.1t3xt.info/examples/
You can also search the keywords list: http://1t3xt.info/tutorials/keywords/

Reply via email to