2016-02-25 2 views
2

Je génère un fichier PDF avec JAVA et Jasper. Ce fichier jasper est conçu avec iReport. Une fois le fichier pdf créé, je voudrais placer une signature avec PdfStamper dans une position concrète dans le pdf. Solutions possibles que j'ai trouvées:Comment localiser une position en pdf générée avec jasperreport pour placer une signature?

Utilisez la méthode PdfSignatureAppearance.setVisibleSignature. Ce ne correspond pas à mes besoins car il localise la signature en position basée sur les coordonnées.

PdfStamper stp = PdfStamper.createSignature(reader, outStream, '\0', fileTmp); 
PdfSignatureAppearance sap = stp.getSignatureAppearance(); 
sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null); 

Utilisez PdfReader.getAcroFields(), puis passer par le AcroFields, obtenir les coordonnées d'un champ de formulaire predifined et insérez la signature comme indiqué dans l'option précédente. Le problème est que je ne suis pas capable de définir AcroFields avec iReport, donc je ne peux pas l'utiliser non plus.

Ma question: est-il possible de définir des champs avec iReport et de les lire après la création du PDF avec Java?

+0

Si vous avez une image (avec signature), vous pouvez regarder [JasperReports - Images Sample] (http://jasperreports.sourceforge.net/sample.reference/images/index.html). Il existe plusieurs types de champs supportés: * java.io.InputStream *, * java.awt.Image *, etc –

Répondre

3

Vous pouvez utiliser le PdfReaderContentParser pour trouver l'image et le texte dans le pdf.

Exemple (montrant comment trouver l'emplacement du texte et l'image en format pdf)

PdfReader reader = new PdfReader(src); 
int pageILikeToCheck =reader.getNumberOfPages(); //set the page or loop them all   
final String matchStr = "FIND THIS TEXT"; 

PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
parser.processContent(pageILikeToCheck, new RenderListener() { 

    @Override 
    public void renderImage(ImageRenderInfo renderInfo) { 
     PdfImageObject image; 
     try { 
      image = renderInfo.getImage(); 
      if (image == null) return; 
      System.out.println("Found image"); 
      System.out.println(renderInfo.getStartPoint()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  
    } 

    @Override 
    public void renderText(TextRenderInfo renderInfo) { 

     if(renderInfo.getText().length()>0 && matchStr.contains(renderInfo.getText())){ 
      System.out.println("FOUND MY TEXT"); 
      System.out.println(renderInfo.getBaseline().getStartPoint()); 
      System.out.println(renderInfo.getBaseline().getEndPoint()); 
     } 
    } 

    @Override 
    public void endTextBlock() { 
    } 

    @Override 
    public void beginTextBlock() { 
    } 
}); 

Cependant, j'ajoute normalement la signature en format pdf à un espace prédéfini (en utilisant la bande pageFooter ou lastPageFooter) à l'aide le PdfStamper

PdfReader reader = new PdfReader(src); 
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); 
PdfStamper stamper = new PdfStamper(reader, baos); 
int pageSignature=1; 
stamper.addSignature("Signature", pageSignature, 320, 570, 550, 620); 

puis écrire baos fichier.

+0

Salut Petter! Merci pour votre réponse. La première approche fonctionne parfaitement! Merci beaucoup. Le problème avec le second est que je ne peux pas trouver le signe dans une position statique, cela dépend du PDF – alvgarvilla

+0

@alvgarvilla Hmm, je ne peux pas comprendre que vous n'avez pas besoin de localiser, vous mettez l'image de la signature dans l'exemple la bande lastPageFooter (de cette façon, elle aura toujours un emplacement exact (sur la dernière page), alors vous y ajouterez la signature pdf avec des positions fixes –

+0

Vrai que la signature de cette façon est à position fixe dans tous les fichiers PDF mais c'est plutôt une opinion raisons si le rapport est agréable ou pas avec la signature sur le fond.Merci merci pour l'accepter. –