itext
Tabellen: iText 5 versus iText 7
Zoeken…
Opmerkingen
De iText 5- PdfPTable
en PdfPCell
zijn gekozen omdat we al klassen hadden met de naam Table
en Cell
om PdfPTable
en PdfPCell
op het hoogste programmeerniveau te maken. Er was ook een klasse met de naam PdfTable
die intern door iText kon worden gebruikt. Die klassen hadden veel gebreken en ze waren verouderd ten gunste van PdfPTable
en PdfPCell
. Ze zijn lang geleden verwijderd.
In de loop der jaren hebben PdfPTable
en PdfPCell
ook wat kritiek gekregen van gebruikers. Bijvoorbeeld: gebruikers begrepen het verschil niet tussen tekstmodus en samengestelde modus.
De tekstmodus wordt gebruikt wanneer u een PdfPCell
als volgt maakt:
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
In dit geval definieert u eigenschappen zoals de horizontale uitlijning op het niveau van de PdfPCell
.
De composietmodus begint wanneer u de methode addElement()
gebruikt:
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
In dit geval worden sommige eigenschappen die op het niveau van de PdfPCell
(zoals de horizontale uitlijning) genegeerd. De horizontale uitlijning moet worden gedefinieerd op het niveau van de elementen die aan de cel worden toegevoegd. Bijvoorbeeld: als u een cel wilt maken waarin verschillende alinea's een verschillende horizontale uitlijning moeten hebben, schakelt u naar de samengestelde modus.
Als u naar de schermafbeelding van de tabel kijkt die met het iText 5-voorbeeld is gemaakt, zult u merken dat de cellen met inhoud Cel 1.1 (toegevoegd in tekstmodus) en Cel 1.2 (toegevoegd in samengestelde modus) heel verschillend zijn uitgelijnd.
Als antwoord op de kritiek op de vreemde afstemming, hebben we methoden geïntroduceerd om informatie over op en neer te gebruiken. We gebruiken deze methoden voor de cellen met inhoud Cel 2.1 (toegevoegd in tekstmodus) en Cel 2.2 (toegevoegd in samengestelde modus). We hebben ook een opvulling van 5 voor deze cellen geïntroduceerd.
Nu is het resultaat veel beter.
Wat we hebben opgelost in iText 7:
Aangezien we iText 7 helemaal opnieuw hebben gemaakt, hadden we geen oudere klassen met namen die we niet opnieuw konden gebruiken. We hebben een nieuwe Table
en een nieuwe Cell
geïntroduceerd.
Er is geen tekstmodus en geen samengestelde modus meer. Een Cell
wordt gemaakt zonder parameters of met parameters die de rowspan en de colspan definiëren. Alle inhoud wordt op dezelfde manier toegevoegd: met de methode add()
.
Onze klanten vroegen ook om een middel om een marge en een opvulling te onderscheiden. In het iText 7-voorbeeld hebben we een grijze achtergrond toegevoegd om het verschil te tonen. In de cel met inhoud Cel 2.1 definiëren we een marge van 5 gebruikerseenheden. De standaard opvulling is 2. In de cel met inhoud Cel 2.2 definiëren we een opvulling van 5 gebruikerseenheden, de standaardmarge in 0.
Zoals u aan de schermafbeeldingen kunt zien, worden de cellen heel mooi weergegeven. We hoefden geen methoden te gebruiken om de ascender of de descender in te stellen. Het standaardgedrag komt veel dichter in de buurt van het gedrag dat een ontwikkelaar zou verwachten.
Wilt u meer weten over tabellen en cellen in iText 7?
Lees AbstractElement-objecten toevoegen (deel 2) in hoofdstuk 5 in de tutorial iText 7: Building Blocks . Ontvang het gratis ebook!
HelloWorldTable.java (iText 5)
In dit voorbeeld maken we de volgende tabel met behulp van iText 5:
We hebben de klasse PdfPTable
en PdfPCell
nodig om dit te bereiken:
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();
}
Bron: developers.itextpdf.com
HelloWorldTable.java (iText 7)
In dit voorbeeld maken we de volgende tabel met behulp van iText 7:
We hebben de klasse Table
and Cell
nodig om dit te bereiken:
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);
}
}
Bron: developers.itextpdf.com en de tutorial iText 7: Building Blocks .