Buscar..


Observaciones

Se eligieron los nombres de clase de iText 5 PdfPTable y PdfPCell porque ya teníamos clases llamadas Table y Cell para crear objetos de tabla y celda en el nivel de programación más alto. También había una clase llamada PdfTable para ser utilizada por iText internamente. Esas clases tenían muchos defectos y estaban en desuso en favor de PdfPTable y PdfPCell . Han sido retirados hace mucho tiempo.

A lo largo de los años, PdfPTable y PdfPCell también recibieron algunas críticas de los usuarios. Por ejemplo: los usuarios no entendieron la diferencia entre el modo de texto y el modo compuesto .

El modo de texto se usa cuando creas un PdfPCell como este:

cell = new PdfPCell(new Phrase("Cell with rowspan 2"));

En este caso, usted define propiedades como la alineación horizontal en el nivel del PdfPCell .

El modo compuesto se addElement() en el momento en que usas el método addElement() :

cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));

En este caso, se ignoran algunas propiedades definidas en el nivel del PdfPCell (como la alineación horizontal). La alineación horizontal debe definirse en el nivel de los elementos agregados a la celda. Por ejemplo: si desea crear una celda en la que párrafos diferentes deban tener una alineación horizontal diferente, cambiará al modo compuesto.

Si observa la captura de pantalla de la tabla creada con el ejemplo de iText 5, notará que las celdas con el contenido de la celda 1.1 (agregada en el modo de texto) y la celda 1.2 (agregada en el modo compuesto) están alineadas de manera muy diferente.

En respuesta a las críticas sobre la alineación impar, introdujimos métodos para usar información ascendente y descendente. Usamos estos métodos para las celdas con contenido Cell 2.1 (agregado en modo texto) y Cell 2.2 (agregado en modo compuesto). También introdujimos un relleno de 5 para estas células.

Ahora el resultado es mucho mejor.

Lo que arreglamos en iText 7:

Desde que creamos iText 7 desde cero, no teníamos clases heredadas con nombres que no pudiéramos reutilizar. Presentamos una nueva Table y una nueva clase de Cell .

No hay más modo de texto ni más modo compuesto. Una Cell se crea sin parámetros o con parámetros que definen el rowpan y el colspan. Todo el contenido se agrega de la misma manera: utilizando el método add() .

Nuestros clientes también solicitaron proporcionar un medio para distinguir un margen y un relleno. En el ejemplo de iText 7, agregamos un fondo gris para mostrar la diferencia. En la celda con contenido Celda 2.1 , definimos un margen de 5 unidades de usuario. El relleno predeterminado es 2. En la celda con contenido Celda 2.2 , definimos un relleno de 5 unidades de usuario, el margen predeterminado en 0.

Como se puede ver en las capturas de pantalla, las celdas se procesan bastante bien. No tuvimos que usar métodos para establecer el ascendente o el descendente. El comportamiento predeterminado es mucho más cercano al comportamiento que un desarrollador esperaría.

¿Quieres saber más sobre tablas y celdas en iText 7?

Lea Agregar objetos AbstractElement (parte 2) que es el capítulo 5 en el tutorial de iText 7: Building Blocks . ¡Consigue el ebook gratis!

HelloWorldTable.java (iText 5)

En este ejemplo, crearemos la siguiente tabla usando iText 5:

introduzca la descripción de la imagen aquí

Necesitamos las PdfPTable y PdfPCell para lograr esto:

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();
}

Fuente: developers.itextpdf.com

HelloWorldTable.java (iText 7)

En este ejemplo, crearemos la siguiente tabla usando iText 7:

introduzca la descripción de la imagen aquí

Necesitaremos la clase Table y Cell para lograr esto:

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);
    }
}

Fuente: developers.itextpdf.com y el tutorial de iText 7: Building Blocks .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow