itext
Tabelle: iText 5 contro iText 7
Ricerca…
Osservazioni
I nomi delle classi iText 5 PdfPTable
e PdfPCell
sono stati scelti perché avevamo già classi denominate Table
e Cell
per creare oggetti table e cell al più alto livello di programmazione. C'era anche una classe chiamata PdfTable
che PdfTable
essere usata internamente da iText. Queste classi avevano molti difetti ed erano deprecate a favore di PdfPTable
e PdfPCell
. Sono stati rimossi molto tempo fa.
Nel corso degli anni, PdfPTable
e PdfPCell
hanno ricevuto anche alcune critiche da parte degli utenti. Ad esempio: gli utenti non hanno compreso la differenza tra la modalità testo e la modalità composita .
La modalità testo viene utilizzata quando si crea un PdfPCell
come questo:
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
In questo caso, si definiscono proprietà come l'allineamento orizzontale al livello di PdfPCell
.
La modalità composita calcia nel momento in cui si utilizza il metodo addElement()
:
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
In questo caso, alcune proprietà definite a livello di PdfPCell
(come l'allineamento orizzontale) vengono ignorate. L'allineamento orizzontale deve essere definito a livello degli elementi aggiunti alla cella. Ad esempio: se si desidera creare una cella in cui paragrafi diversi devono avere un diverso allineamento orizzontale, si passa alla modalità composita.
Se si guarda la schermata della tabella creata con l'esempio di iText 5, si noterà che le celle con contenuto Cella 1.1 (aggiunta in modalità testo) e Cella 1.2 (aggiunta in modalità composita) sono allineate in modo diverso.
In risposta alle critiche sull'allineamento dispari, abbiamo introdotto metodi per utilizzare le informazioni di ascender e discender. Utilizziamo questi metodi per le celle con contenuto Cell 2.1 (aggiunto in modalità testo) e Cell 2.2 (aggiunto in modalità composita). Abbiamo anche introdotto una imbottitura di 5 per queste celle.
Ora il risultato è molto meglio.
Cosa abbiamo risolto in iText 7:
Da quando abbiamo creato iText 7 da zero, non avevamo classi legacy con nomi che non potevamo riutilizzare. Abbiamo introdotto una nuova Table
e una nuova classe di Cell
.
Non c'è più modalità testo e non più modalità composita. Una Cell
viene creata senza parametri o con parametri che definiscono il rowspan e il colspan. Tutto il contenuto è aggiunto allo stesso modo: usando il metodo add()
.
I nostri clienti chiedevano anche di fornire un mezzo per distinguere un margine e una imbottitura. Nell'esempio di iText 7 abbiamo aggiunto uno sfondo grigio per mostrare la differenza. Nella cella con contenuto Cell 2.1 , definiamo un margine di 5 unità utente. Il riempimento predefinito è 2. Nella cella con contenuto Cell 2.2 , definiamo un riempimento di 5 unità utente, il margine predefinito in 0.
Come puoi vedere dalle schermate, le celle sono rese abbastanza bene. Non abbiamo dovuto usare metodi per impostare l'ascender o il discensore. Il comportamento predefinito è molto più vicino al comportamento che uno sviluppatore si aspetterebbe.
Vuoi saperne di più su tabelle e celle in iText 7?
Leggi l' aggiunta di oggetti AbstractElement (parte 2), che è il capitolo 5 del tutorial di iText 7: Building Blocks . Ottieni l'ebook gratuito!
HelloWorldTable.java (iText 5)
In questo esempio, creeremo la seguente tabella usando iText 5:
Abbiamo bisogno della classe PdfPTable
e PdfPCell
per ottenere ciò:
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();
}
Fonte: developers.itextpdf.com
HelloWorldTable.java (iText 7)
In questo esempio, creeremo la seguente tabella usando iText 7:
Avremo bisogno della classe Table
and Cell
per ottenere ciò:
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);
}
}
Fonte: developers.itextpdf.com e il tutorial di iText 7: Building Blocks .