Question

Je crée un fichier pdf à l'aide de la bibliothèque de rapports BIRT . Plus tard, je dois signer numériquement ces fichiers. J'utilise iText pour signer numériquement le document.

Le problème auquel je suis confronté est qu’il me faut placer la signature à différents endroits dans différents rapports. J'ai déjà le code pour signer numériquement le document; maintenant, je place toujours la signature au bas de la dernière page de chaque rapport.

Finalement, chaque rapport doit indiquer où je dois placer la signature. Ensuite, je dois lire l'emplacement à l'aide d'iText, puis placer la signature à cet endroit.

Est-ce possible d'utiliser BIRT et iText

Merci

Était-ce utile?

La solution

Si vous êtes prêt à tricher un peu, vous pouvez utiliser un lien ... que BIRT prend en charge selon mon petit plongeon dans leur documentation tout à l'heure.

Un lien est une annotation. Malheureusement, iText ne prend pas en charge l'examen des annotations à un niveau élevé, mais uniquement leur génération, vous devrez donc utiliser les appels d'objet de niveau inférieur.

Le code à extraire pourrait ressembler à ceci:

// getPageN is looking for a page number, not a page index
PdfDictionary lastPageDict = myReader.getPageN(myReader.getNumberOfPages());

PdfArray annotations = lastPageDict.getAsArray( PdfName.ANNOTS );
PdfArray linkRect = null;
if (annotations != null) {
  int numAnnots = annotations.size();
  for (int i = 0; i < numAnnots; ++i) {
    PdfDictionary annotDict = annotations.getAsDict( i );
    if (annotDict == null) 
      continue; // it'll never happen, unless you're dealing with a Really Messed Up PDF.

    if (PdfName.LINK.equals( annotDict.getAsName( PdfName.SUBTYPE ) )) {
      // if this isn't the only link on the last page, you'll have to check the URL, which
      // is a tad more work.
      linkRect = annotDict.getAsArray( PdfName.RECT );

      // a little sanity check here wouldn't hurt, but I have yet to come across a PDF
      // that was THAT screwed up, and I've seen some Really Messed Up PDFs over the years.

      // and kill the link, it's just there for a placeholder anyway.
      // iText doesn't maintain any extra info on links, so no need for other calls.
      annotations.remove( i ); 
      break;
    }
  }
}

if (linkRect != null) {
  // linkRect is an array, thusly: [ llx, lly, urx, ury ].
  // you could use floats instead, but I wouldn't go with integers.  
  double llx = linkRect.getAsNumber( 0 ).getDoubleValue(); 
  double lly = linkRect.getAsNumber( 1 ).getDoubleValue();
  double urx = linkRect.getAsNumber( 2 ).getDoubleValue();
  double ury = linkRect.getAsNumber( 3 ).getDoubleValue();

  // make your signature
  magic();
}

Si BIRT génère du texte dans le contenu de la page sous le lien pour en donner une représentation visuelle, il ne s'agit que d'un problème mineur. Votre signature doit le recouvrir complètement.

Vous êtes définitivement mieux si vous pouvez générer la signature directement à partir de BIRT en premier lieu, mais ma petite inspection de leurs documents ne m'a pas vraiment donné confiance en leurs capacités de personnalisation PDF ... bien qu'ils soient assis au sommet de iText eux-mêmes. C’est un générateur de rapports qui peut produire des PDF ... Je ne devrais pas trop en attendre trop . `

Modifier: si vous devez rechercher l'URL spécifique, consultez la section " 12.5.6.5 Annotations de lien " de la référence PDF, que vous pouvez trouver ici: http://www.adobe.com/content /dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

Autres conseils

Je ne connais rien à BIRT et je ne connais que très peu iText. Mais peut-être que cela fonctionne ...

BIRT peut-il générer le contour de la zone de signature sous forme de champ de formulaire standard portant un nom de champ donné? Si oui, alors vous devriez pouvoir:

  1. Recherchez ce champ par son nom dans la table de hachage AcroFields de iText à l'aide de getField;
  2. Créez une nouvelle signature à l'aide de l'estampeur pdf et définissez sa géométrie en fonction des valeurs de l'ancien objet de champ. et
  3. Supprimez l'ancien champ à l'aide de removeField.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top