itext
Tableaux: iText 5 versus iText 7
Recherche…
Remarques
Les noms de classe iText 5 PdfPTable
et PdfPCell
ont été choisis car nous avions déjà des classes nommées Table
et Cell
pour créer des objets de table et de cellule au niveau de programmation le plus élevé. Il y avait aussi une classe nommée PdfTable
à utiliser par iText en interne. Ces classes avaient beaucoup de défauts et elles étaient déconseillées en faveur de PdfPTable
et PdfPCell
. Ils ont été enlevés il y a longtemps.
Au fil des ans, PdfPTable
et PdfPCell
également été critiqués par les utilisateurs. Par exemple: les utilisateurs ne comprenaient pas la différence entre le mode texte et le mode composite .
Le mode texte est utilisé lorsque vous créez un PdfPCell
comme ceci:
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
Dans ce cas, vous définissez des propriétés comme l'alignement horizontal au niveau de PdfPCell
.
Le mode composite intervient au moment où vous utilisez la méthode addElement()
:
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
Dans ce cas, certaines propriétés définies au niveau de PdfPCell
(comme l'alignement horizontal) sont ignorées. L'alignement horizontal doit être défini au niveau des éléments ajoutés à la cellule. Par exemple: si vous souhaitez créer une cellule dans laquelle différents paragraphes doivent avoir un alignement horizontal différent, vous passerez en mode composite.
Si vous regardez la capture d'écran de la table créée avec l'exemple iText 5, vous remarquerez que les cellules avec le contenu Cell 1.1 (ajouté en mode texte) et Cell 1.2 (ajouté en mode composite) sont alignées différemment.
En réponse à la critique sur l'alignement impair, nous avons introduit des méthodes pour utiliser les informations sur les ascendeurs et les descendants. Nous utilisons ces méthodes pour les cellules contenant le contenu Cell 2.1 (ajouté en mode texte) et Cell 2.2 (ajouté en mode composite). Nous avons également introduit un remplissage de 5 pour ces cellules.
Maintenant, le résultat est bien meilleur.
Ce que nous avons corrigé dans iText 7:
Depuis que nous avons créé iText 7 à partir de rien, nous n'avions aucune classe existante avec des noms que nous ne pouvions pas réutiliser. Nous avons introduit une nouvelle Table
et une nouvelle classe de Cell
.
Il n'y a plus de mode texte et plus de mode composite. Une Cell
est créée soit sans paramètres, soit avec des paramètres qui définissent les lignes et le colspan. Tout le contenu est ajouté de la même manière: en utilisant la méthode add()
.
Nos clients demandaient également de fournir un moyen de distinguer une marge et un rembourrage. Dans l'exemple iText 7, nous avons ajouté un fond gris pour montrer la différence. Dans la cellule avec le contenu Cell 2.1 , nous définissons une marge de 5 unités utilisateur. Le remplissage par défaut est 2. Dans la cellule contenant le contenu Cell 2.2 , nous définissons un remplissage de 5 unités utilisateur, la marge par défaut étant 0.
Comme vous pouvez le voir sur les captures d'écran, les cellules sont très bien rendues. Nous n'avons pas eu à utiliser de méthodes pour définir l'ascendeur ou le descendeur. Le comportement par défaut est beaucoup plus proche du comportement attendu par un développeur.
Vous voulez en savoir plus sur les tableaux et les cellules dans iText 7?
Lire Ajout d'objets AbstractElement (partie 2), qui est le chapitre 5 du didacticiel iText 7: Building Blocks . Obtenez l'ebook gratuit!
HelloWorldTable.java (iText 5)
Dans cet exemple, nous allons créer le tableau suivant en utilisant iText 5:
Nous avons besoin des PdfPTable
et PdfPCell
pour y parvenir:
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(3);
PdfPCell cell = new PdfPCell(new Phrase("Cell with colspan 3"));
cell.setColspan(3);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
cell.setRowspan(2);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell 2.1"));
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell();
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
Paragraph p = new Paragraph("Cell 2.2");
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
table.addCell(cell);
document.add(table);
document.close();
}
Source: developers.itextpdf.com
HelloWorldTable.java (iText 7)
Dans cet exemple, nous allons créer le tableau suivant en utilisant iText 7:
Nous avons besoin de la classe Table
et Cell
pour y parvenir:
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
try (Document document = new Document(pdf)) {
Table table = new Table(3);
Cell cell = new Cell(1, 3)
.setTextAlignment(TextAlignment.CENTER)
.add("Cell with colspan 3");
table.addCell(cell);
cell = new Cell(2, 1)
.add("Cell with rowspan 2")
.setVerticalAlignment(VerticalAlignment.MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
table.addCell(new Cell().add("Cell 1.2"));
table.addCell(new Cell()
.add("Cell 2.1")
.setBackgroundColor(Color.LIGHT_GRAY)
.setMargin(5));
table.addCell(new Cell()
.add("Cell 1.2")
.setBackgroundColor(Color.LIGHT_GRAY)
.setPadding(5));
document.add(table);
}
}
Source: developers.itextpdf.com et le tutoriel iText 7: Building Blocks .