itext
Tabeller: iText 5 kontra iText 7
Sök…
Anmärkningar
IText 5- PdfPTable
och PdfPCell
valdes eftersom vi redan hade klasser med namnet Table
och Cell
att skapa tabell- och cellobjekt på den högsta programmeringsnivån. Det fanns också en klass med namnet PdfTable
som skulle användas av iText internt. Dessa klasser hade många brister och de avskrivs till förmån för PdfPTable
och PdfPCell
. De har tagits bort för länge sedan.
Under åren fick PdfPTable
och PdfPCell
också kritik från användare. Till exempel: användare förstod inte skillnaden mellan textläge och kompositläge .
Textläge används när du skapar en PdfPCell
så här:
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
I det här fallet definierar du egenskaper som den horisontella justeringen på nivån på PdfPCell
.
Kompositläget sparkar i det ögonblick du använder addElement()
:
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
I det här fallet ignoreras vissa egenskaper definierade på PdfPCell
(t.ex. den horisontella justeringen). Den horisontella justeringen ska definieras på nivån för elementen som läggs till cellen. Till exempel: om du vill skapa en cell där olika stycken behöver ha en annan horisontell inriktning, byter du till kompositläge.
Om du tittar på skärmbilden i tabellen skapad med iText 5-exemplet kommer du att märka att cellerna med innehållet Cell 1.1 (tillagd i textläge) och Cell 1.2 (tillagda i sammansatt läge) är inriktade helt annorlunda.
Som svar på kritiken mot den udda justeringen introducerade vi metoder för att använda information om uppstigande och nedstigande. Vi använder dessa metoder för celler med innehåll Cell 2.1 (läggs till i textläge) och Cell 2.2 (läggs till i kompositläge). Vi introducerade också en stoppning av 5 för dessa celler.
Nu är resultatet mycket bättre.
Vad vi fixade i iText 7:
Eftersom vi skapade iText 7 från grunden hade vi inga arvskurser med namn som vi inte kunde återanvända. Vi introducerade ett nytt Table
och en ny Cell
.
Det finns inget mer textläge och inget mer sammansatt läge. En Cell
skapas antingen utan parametrar eller med parametrar som definierar radspan och colspan. Allt innehåll läggs till på samma sätt: med metoden add()
.
Våra kunder bad också om att tillhandahålla ett sätt att skilja marginal och stoppning. I iText 7-exemplet har vi lagt till en grå bakgrund för att visa skillnaden. I cellen med innehåll Cell 2.1 definierar vi en marginal på 5 användarenheter. Standard stoppning är 2. I cellen med innehåll Cell 2.2 definierar vi en stoppning av 5 användarenheter, standardmarginalen i 0.
Som du kan se på skärmbilderna, är cellerna gjorda ganska snyggt. Vi behövde inte använda metoder för att ställa in ascender eller descender. Standardbeteendet är mycket närmare beteendet som en utvecklare kan förvänta sig.
Vill du veta mer om tabeller och celler i iText 7?
Läs Lägga till AbstractElement-objekt (del 2) som är kapitel 5 i iText 7: Building Blocks- handledning. Skaffa gratis e-bok!
HelloWorldTable.java (iText 5)
I det här exemplet skapar vi följande tabell med iText 5:
Vi behöver klassen PdfPTable
och PdfPCell
att uppnå detta:
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();
}
Källa: utvecklare.itextpdf.com
HelloWorldTable.java (iText 7)
I det här exemplet skapar vi följande tabell med iText 7:
Vi behöver klassen Table
och Cell
att uppnå detta:
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);
}
}
Källa: utvecklare.itextpdf.com och iText 7: Handledning för byggstenar .