2016-06-22 3 views
1

Nous avons été en mesure d'ajouter un PdfFormField à un emplacement spécifique de la page en utilisant l'extrait de code Scala suivant. Cependant, ce que nous aimerions pouvoir faire est de l'ajouter après le dernier paragraphe sur la page que nous avons insérée. (C'est-à-dire que ce champ vient juste après). Existe-t-il un moyen de dériver le rectangle approprié, ou existe-t-il un moyen plus simple? RemerciementsComment puis-je ajouter un PdfFormField en utilisant IText 7 à la position de la page en cours

Répondre

2

Il n'y a actuellement aucune façon prête à l'emploi d'ajouter des champs à la mise en page, mais l'équipe iText envisage d'implémenter cette fonctionnalité. En même temps, il existe des moyens faciles d'atteindre votre objectif, et il y en a quelques-uns. Mes exemples seront en Java, mais je suppose que vous pourrez facilement les utiliser dans Scala.

La première approche consiste simplement à obtenir la position du bas du paragraphe que vous avez ajouté et à ajouter votre champ par rapport à cette position. La position basse du dernier paragraphe se trouve être la première position du reste de la boîte disponible du contenu de la page (région), qui convertit le code suivant:

Document doc = new Document(pdfDoc); 
doc.add(new Paragraph("This is a paragraph.\nForm field will be inserted after it")); 

Rectangle freeBBox = doc.getRenderer().getCurrentArea().getBBox(); 
float top = freeBBox.getTop(); 
float fieldHeight = 20; 
PdfTextFormField field = PdfFormField.createText(pdfDoc, 
      new Rectangle(freeBBox.getLeft(), top - fieldHeight, 100, fieldHeight), "myField", "Value"); 
form.addField(field); 

La partie qui vous intéresse est

Rectangle freeBBox = doc.getRenderer().getCurrentArea().getBBox(); 

qui vous donne le rectangle où le contenu n'est pas encore placé.

Notez cependant que cette approche n'affectera pas les paragraphes suivants après celui où vous souhaitez ajouter le champ de formulaire, ce qui signifie que ce champ de formulaire et le contenu peuvent se chevaucher. Pour faire face à cette situation, vous pouvez profiter de la possibilité de créer des éléments de disposition personnalisés dans iText7.

Ce qui, à son tour, est converti en code suivant:

private static class TextFieldRenderer extends DivRenderer { 
    public TextFieldRenderer(TextFieldLayoutElement modelElement) { 
     super(modelElement); 
    } 

    @Override 
    public void draw(DrawContext drawContext) { 
     super.draw(drawContext); 
     PdfAcroForm form = PdfAcroForm.getAcroForm(drawContext.getDocument(), true); 
     PdfTextFormField field = PdfFormField.createText(drawContext.getDocument(), 
       occupiedArea.getBBox(), "myField2", "Another Value"); 
     form.addField(field); 
    } 
} 

private static class TextFieldLayoutElement extends Div { 
    @Override 
    public IRenderer getRenderer() { 
     return new TextFieldRenderer(this); 
    } 
} 

Ensuite, vous aurez juste besoin d'ajouter les éléments d'une manière fantaisie:

doc.add(new Paragraph("This is another paragraph.\nForm field will be inserted right after it.")); 
doc.add(new TextFieldLayoutElement().setWidth(100).setHeight(20)); 
doc.add(new Paragraph("This paragraph follows the form field")); 

En bref, ce que nous avons fait ici est que nous avons créé un élément Div personnalisé (qui est un analogue de div de HTML), qui occupera la zone pendant la mise en page, mais nous avons défini #draw() opérateur personnalisé pour cet élément de sorte que le champ de formulaire est inséré juste quand nous savons exactement position où nous voulons le faire.

Vous pouvez trouver le code complet de l'échantillon here. Notez cependant que le lien peut changer lorsque le référentiel d'échantillons est en cours de réorganisation.