Criar ou Adicionar Tabela em PDF

Criando Tabela

O namespace Aspose.PDF contém classes chamadas Table, Cell, e Row que fornecem funcionalidade para criar tabelas ao gerar documentos PDF do zero.

A tabela pode ser criada criando um objeto da Classe Table.

Aspose.Pdf.Table table = new Aspose.Pdf.Table();

Adicionando Tabela em Documento PDF Existente

Para adicionar uma tabela a um arquivo PDF existente com Aspose.PDF para Java, siga os seguintes passos:

  1. Carregue o arquivo de origem.

  2. Inicializar uma tabela e definir suas colunas e linhas.

  3. Definir configuração da tabela (definimos as bordas).

  4. Preencher a tabela.

  5. Adicionar a tabela a uma página.

  6. Salvar o arquivo.

Os seguintes trechos de código mostram como adicionar texto em um arquivo PDF existente.

package com.aspose.pdf.examples;

import com.aspose.pdf.*;

public class ExampleAddTable {

    private static String _dataDir = "/home/admin1/pdf-examples/Samples/";

    public static void CreateTable() {
        Document doc = new Document(_dataDir + "input.pdf");
        // Inicializa uma nova instância da Tabela
        Table table = new Table();
        // Define a cor da borda da tabela como CinzaClaro
        table.setBorder(new BorderInfo(BorderSide.All, .5f, Color.getLightGray()));
        // define a borda para as células da tabela
        table.setDefaultCellBorder(new BorderInfo(BorderSide.All, .5f, Color.getLightGray()));
        // cria um loop para adicionar 10 linhas
        for (int row_count = 1; row_count < 10; row_count++) {
            // adiciona linha à tabela
            Row row = table.getRows().add();
            // adiciona células à tabela
            row.getCells().add("Coluna (" + row_count + ", 1)");
            row.getCells().add("Coluna (" + row_count + ", 2)");
            row.getCells().add("Coluna (" + row_count + ", 3)");
        }
        // Adiciona objeto tabela à primeira página do documento de entrada
        doc.getPages().get_Item(1).getParagraphs().add(table);
        // Salva o documento atualizado contendo o objeto tabela
        doc.save(_dataDir + "document_with_table.pdf");
    }

ColSpan e RowSpan em Tabelas Aspose.PDF usando Java

Aspose.PDF para Java fornece o método setColSpan para mesclar as colunas em uma tabela e o método setRowSpan para mesclar as linhas.

Usamos os métodos setColSpan ou setRowSpan no objeto Cell que cria a célula da tabela. Após aplicar as propriedades necessárias, a célula criada pode ser adicionada à tabela.

public static void AddTable_RowColSpan() {
        // Carregar documento PDF de origem
        Document pdfDocument = new Document();
        Page page = pdfDocument.getPages().add();

        // Inicializa uma nova instância da Tabela
        Table table = new Table();
        // Define a cor da borda da tabela como LightGray
        table.setBorder(new BorderInfo(BorderSide.All, .5f, Color.getBlack()));
        // Define a borda para células da tabela
        table.setDefaultCellBorder(new BorderInfo(BorderSide.All, .5f, Color.getBlack()));
        // Adiciona a 1ª linha à tabela
        Row row1 = table.getRows().add();
        for (int cellCount = 1; cellCount < 5; cellCount++) {
            // Adiciona células à tabela
            row1.getCells().add("Teste 1 " + cellCount);
        }

        // Adiciona a 2ª linha à tabela
        Row row2 = table.getRows().add();
        row2.getCells().add("Teste 2 1");
        Cell cell = row2.getCells().add("Teste 2 2");
        cell.setColSpan(2);
        row2.getCells().add("Teste 2 4");

        // Adiciona a 3ª linha à tabela
        Row row3 = table.getRows().add();
        row3.getCells().add("Teste 3 1");
        row3.getCells().add("Teste 3 2");
        row3.getCells().add("Teste 3 3");
        row3.getCells().add("Teste 3 4");

        // Adiciona a 4ª linha à tabela
        Row row4 = table.getRows().add();
        row3.getCells().add("Teste 4 1");
        cell = row3.getCells().add("Teste 4 2");
        cell.setRowSpan(2);
        row3.getCells().add("Teste 4 3");
        row3.getCells().add("Teste 4 4");

        // Adiciona a 5ª linha à tabela
        row4 = table.getRows().add();
        row4.getCells().add("Teste 5 1");
        row4.getCells().add("Teste 5 3");
        row4.getCells().add("Teste 5 4");

        // Adiciona o objeto tabela à primeira página do documento de entrada
        page.getParagraphs().add(table);

        // Salva o documento atualizado contendo o objeto tabela
        pdfDocument.save(_dataDir + "document_with_table_out.pdf");
    }

O resultado do código de execução abaixo é a tabela mostrada na imagem a seguir:

Demonstração de ColSpan e RowSpan

Trabalhando com Bordas, Margens e Preenchimento

Aspose.PDF para Java permite que os desenvolvedores criem tabelas em documentos PDF. De acordo com o Modelo de Objeto de Documento do Aspose.PDF, uma tabela é um elemento de nível de parágrafo.

Observe que ele também suporta o recurso de definir estilo de borda, margens e preenchimento de célula para tabelas. Antes de entrar em mais detalhes técnicos, é importante entender os conceitos de borda, margens e preenchimento que são apresentados abaixo em um diagrama:

Bordas, margens e preenchimento

Na figura acima, você pode ver que as bordas da tabela, linha e célula se sobrepõem. Usando Aspose.PDF, uma tabela pode ter margens e as células podem ter preenchimentos. Para definir margens de célula, precisamos definir o preenchimento da célula.

Bordas

Para definir as bordas dos objetos Table, Row e Cell, use os métodos Table.setBorder, Row.setBorder e Cell.setBorder. Bordas de células também podem ser definidas usando a classe Table ou Row método DefaultCellBorder. Todas as propriedades relacionadas a bordas discutidas acima são atribuídas a uma instância da classe Row, que é criada chamando seu construtor. A classe Row tem muitas sobrecargas que aceitam quase todos os parâmetros necessários para personalizar a borda.

Margens ou Espaçamento Interno

O espaçamento interno de células pode ser gerenciado usando o método DefaultCellPadding da classe Table. Todas as propriedades relacionadas ao preenchimento são atribuídas a uma instância da classe MarginInfo que recebe informações sobre os parâmetros Left, Right, Top e Bottom para criar margens personalizadas.

No exemplo a seguir, a largura da borda da célula é definida como 0.1 ponto, a largura da borda da tabela é definida como 1 ponto e o preenchimento da célula é definido como 5 pontos.

Margem e Borda em Tabela PDF

public static void MargingPadding() {
        // Instanciar o objeto Document chamando seu construtor vazio
        Document doc = new Document();
        Page page = doc.getPages().add();
        // Instanciar um objeto de tabela
        Table tab1 = new Table();
        // Adicionar a tabela na coleção de parágrafos da seção desejada
        page.getParagraphs().add(tab1);
        // Definir larguras de coluna da tabela
        tab1.setColumnWidths ("50 50 50");
        // Definir borda de célula padrão usando o objeto BorderInfo
        tab1.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.1F));
        // Definir borda da tabela usando outro objeto BorderInfo personalizado
        tab1.setBorder (new BorderInfo(BorderSide.All, 1F));

        // Criar objeto MarginInfo e definir suas margens esquerda, inferior, direita e superior
        MarginInfo margin = new MarginInfo();
        margin.setTop (5f);
        margin.setLeft (5f);
        margin.setRight (5f);
        margin.setBottom (5f);

        // Definir o preenchimento padrão da célula para o objeto MarginInfo
        tab1.setDefaultCellPadding(margin);

        // Criar linhas na tabela e depois células nas linhas
        Row row1 = tab1.getRows().add();
        row1.getCells().add("col1");
        row1.getCells().add("col2");
        row1.getCells().add();

        TextFragment mytext = new TextFragment("col3 com uma longa string de texto");

        row1.getCells().get_Item(2).getParagraphs().add(mytext);
        row1.getCells().get_Item(2).setWordWrapped(false);

        Row row2 = tab1.getRows().add();
        row2.getCells().add("item1");
        row2.getCells().add("item2");
        row2.getCells().add("item3");

        // Salvar o PDF
        doc.save(_dataDir + "MarginsOrPadding_out.pdf");
    }
}

Para criar uma tabela com cantos arredondados, use o valor RoundedBorderRadius da classe BorderInfo e defina o estilo dos cantos da tabela como arredondado.

    public static void RoundedBorderRadius() {
        Document doc = new Document();
        Page page = doc.getPages().add();

        // Instanciar um objeto de tabela
        Table tab1 = new Table();

        // Adicionar a tabela na coleção de parágrafos da seção desejada
        page.getParagraphs().add(tab1);

        GraphInfo graph = new GraphInfo();
        graph.setColor(Color.getRed());
        // Criar um objeto BorderInfo em branco
        BorderInfo bInfo = new BorderInfo(BorderSide.All, graph);
        // Definir a borda como uma borda arredondada onde o raio do arredondamento é 15
        bInfo.setRoundedBorderRadius(15);
        // Definir o estilo do canto da tabela como Arredondado.
        tab1.setCornerStyle(BorderCornerStyle.Round);
        // Definir as informações da borda da tabela
        tab1.setBorder(bInfo);
        // Criar linhas na tabela e depois células nas linhas
        Row row1 = tab1.getRows().add();
        row1.getCells().add("col1");
        row1.getCells().add("col2");
        row1.getCells().add();

        TextFragment mytext = new TextFragment("col3 com uma longa string de texto");

        row1.getCells().get_Item(2).getParagraphs().add(mytext);
        row1.getCells().get_Item(2).setWordWrapped(false);

        Row row2 = tab1.getRows().add();
        row2.getCells().add("item1");
        row2.getCells().add("item2");
        row2.getCells().add("item3");

        // Salvar o PDF
        doc.save(_dataDir + "BorderRadius_out.pdf");
    }

Propriedade AutoFitToWindow na enumeração ColumnAdjustmentType

 public static void AutoFitToWindowProperty() {
        // Instanciar o objeto Pdf chamando seu construtor vazio
        Document doc = new Document();
        // Criar a seção no objeto Pdf
        Page sec1 = doc.getPages().add();

        // Instanciar um objeto de tabela
        Table tab1 = new Table();
        // Adicionar a tabela na coleção de parágrafos da seção desejada
        sec1.getParagraphs().add(tab1);

        // Definir larguras de coluna da tabela
        tab1.setColumnWidths("50 50 50");
        tab1.setColumnAdjustment(ColumnAdjustment.AutoFitToWindow);

        // Definir borda de célula padrão usando o objeto BorderInfo
        tab1.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.1F));

        // Definir borda da tabela usando outro objeto BorderInfo personalizado
        tab1.setBorder(new BorderInfo(BorderSide.All, 1F));

        // Criar objeto MarginInfo e definir suas margens esquerda, inferior, direita e superior
        MarginInfo margin = new MarginInfo();
        margin.setTop(5f);
        margin.setLeft(5f);
        margin.setRight(5f);
        margin.setBottom(5f);

        // Definir o preenchimento de célula padrão para o objeto MarginInfo
        tab1.setDefaultCellPadding(margin);

        // Criar linhas na tabela e, em seguida, células nas linhas
        Row row1 = tab1.getRows().add();
        row1.getCells().add("col1");
        row1.getCells().add("col2");
        row1.getCells().add("col3");
        Row row2 = tab1.getRows().add();
        row2.getCells().add("item1");
        row2.getCells().add("item2");
        row2.getCells().add("item3");

        // Salvar documento atualizado contendo objeto tabela
        doc.save(_dataDir + "AutoFitToWindow_out.pdf");
    }

Obter Largura da Tabela

Às vezes, é necessário obter a largura da tabela dinamicamente. A classe Aspose.PDF.Table possui um método GetWidth para esse propósito. Por exemplo, você não definiu a largura das colunas da tabela explicitamente e definiu ColumnAdjustment para AutoFitToContent. Nesse caso, você pode obter a largura da tabela da seguinte forma.

public static void GetTableWidth() {
        // Criar um novo documento
        Document doc = new Document();
        // Adicionar página no documento
        Page page = doc.getPages().add();

        // Inicializar nova tabela
        Table table = new Table();

        // Adicionar a tabela na coleção de parágrafos da seção desejada
        page.getParagraphs().add(table);
        table.setColumnAdjustment(ColumnAdjustment.AutoFitToContent);

        // Adicionar linha na tabela
        Row row = table.getRows().add();
        // Adicionar célula na tabela
        row.getCells().add("Texto da Célula 1");
        row.getCells().add("Texto da Célula 2");
        // Obter largura da tabela
        System.out.println(table.getWidth());
    }

Adicionar Objeto SVG à Célula da Tabela

Aspose.PDF para Java suporta o recurso de adicionar uma célula de tabela em um arquivo PDF. Ao criar uma tabela, é possível adicionar texto ou imagens nas células. Além disso, a API também oferece o recurso de converter arquivos SVG para o formato PDF. Usando uma combinação desses recursos, é possível carregar uma imagem SVG e adicioná-la em uma célula da tabela.

O trecho de código a seguir mostra as etapas para criar uma instância de tabela e adicionar uma imagem SVG dentro de uma célula da tabela.

 public static void AddSVGObjectToTableCell() {
        // Instanciar objeto Document
        Document doc = new Document();
        // Criar uma instância de imagem
        com.aspose.pdf.Image img = new com.aspose.pdf.Image();
        // Definir tipo de imagem como SVG
        img.setFileType (com.aspose.pdf.ImageFileType.Svg);
        // Caminho para o arquivo de origem
        img.setFile (_dataDir + "SVGToPDF.svg");
        // Definir largura para instância de imagem
        img.setFixWidth (50);
        // Definir altura para instância de imagem
        img.setFixHeight (50);
        // Criar instância de tabela
        com.aspose.pdf.Table table = new com.aspose.pdf.Table();
        // Definir largura para células da tabela
        table.setColumnWidths ("100 100");
        // Criar objeto de linha e adicioná-lo à instância de tabela
        com.aspose.pdf.Row row = table.getRows().add();
        // Criar objeto de célula e adicioná-lo à instância de linha
        com.aspose.pdf.Cell cell = row.getCells().add();
        // Adicionar fragmento de texto à coleção de parágrafos do objeto de célula
        cell.getParagraphs().add(new TextFragment("First cell"));
        // Adicionar outra célula ao objeto de linha
        cell = row.getCells().add();
        // Adicionar imagem SVG à coleção de parágrafos da instância de célula recém-adicionada
        cell.getParagraphs().add(img);
        // Criar objeto de página e adicioná-lo à coleção de páginas da instância de documento
        Page page = doc.getPages().add();
        // Adicionar tabela à coleção de parágrafos do objeto de página
        page.getParagraphs().add(table);
        // Salvar arquivo PDF
        doc.save(_dataDir + "AddSVGObject_out.pdf");
    }

Adicionar Tags HTML em uma Tabela

Aspose.PDF para Java permite adicionar um novo Fragmento HTML em um Parágrafo do seu arquivo PDF.

  public static void AddHTMLFragmentToTableCell() {
        Document doc = new Document(_dataDir + "input.pdf");
        // Inicializa uma nova instância da Tabela
        Table table = new Table();
        // Define a cor da borda da tabela como Cinza Claro
        table.setBorder(new BorderInfo(BorderSide.All, .5f, Color.getLightGray()));
        // define a borda para as células da tabela
        table.setDefaultCellBorder(new BorderInfo(BorderSide.All, .5f, Color.getLightGray()));
        // cria um loop para adicionar 10 linhas
        for (int row_count = 1; row_count < 10; row_count++) {
            Cell cell;
            // adiciona linha à tabela
            Row row = table.getRows().add();
            // adiciona células à tabela
            cell = row.getCells().add();
            cell.getParagraphs().add(new HtmlFragment("Coluna <strong>(" + row_count + ", 1)</strong>"));

            cell = row.getCells().add();
            cell.getParagraphs().add(new HtmlFragment("Coluna <span style='color:red'>(" + row_count + ", 2)</span>"));

            cell = row.getCells().add();
            cell.getParagraphs().add(new HtmlFragment("Coluna <span style='text-decoration: underline'>(" + row_count + ", 3)</span>"));
        }
        // Adiciona o objeto tabela à primeira página do documento de entrada
        doc.getPages().get_Item(1).getParagraphs().add(table);
        // Salva o documento atualizado contendo o objeto tabela
        doc.save(_dataDir + "AddHTMLObject_out.pdf");
    }

}

Inserir uma Quebra de Página entre as linhas da tabela

Como comportamento padrão, ao criar uma tabela dentro de um arquivo PDF, a tabela flui para as páginas subsequentes quando atinge a margem inferior da tabela. No entanto, podemos ter um requisito para forçar a inserção de uma quebra de página quando um certo número de linhas é adicionado à tabela. O trecho de código a seguir mostra as etapas para inserir uma quebra de página quando 10 linhas são adicionadas à tabela.

    public static void InsertPageBreak() {
        // Instanciar instância do Documento
        Document doc = new Document();
        // Adicionar página à coleção de páginas do arquivo PDF
        Page page = doc.getPages().add();
        // Criar instância de tabela
        Table tab = new Table();
        // Definir estilo de borda para a tabela
        tab.setBorder (new BorderInfo(BorderSide.All, Color.getRed()));
        // Definir estilo de borda padrão para a tabela com cor de borda como Vermelho
        tab.setDefaultCellBorder (new BorderInfo(BorderSide.All, Color.getRed()));
        // Especificar largura das colunas da tabela
        tab.setColumnWidths ("100 100");
        // Criar um loop para adicionar 200 linhas à tabela
        for (int counter = 0; counter <= 200; counter++) {
            Row row = new Row();
            tab.getRows().add(row);
            Cell cell1 = new Cell();
            cell1.getParagraphs().add(new TextFragment("Cell " + counter + ", 0"));
            row.getCells().add(cell1);
            Cell cell2 = new Cell();
            cell2.getParagraphs().add(new TextFragment("Cell " + counter + ", 1"));
            row.getCells().add(cell2);
            // Quando 10 linhas são adicionadas, renderizar nova linha em nova página
            if (counter % 10 == 0 && counter != 0)
                row.setInNewPage(true);
        }
        // Adicionar tabela à coleção de parágrafos do arquivo PDF
        page.getParagraphs().add(tab);

        // Salvar o documento PDF
        doc.save(_dataDir + "InsertPageBreak_out.pdf");
    }

Ocultar Bordas de Células Abrangidas

Ao adicionar células a uma tabela, as bordas das células abrangidas podem aparecer quando elas se quebram em outra linha. Tais bordas abrangidas podem ser ocultadas conforme mostrado no exemplo de código a seguir.

Document doc = new Document();
com.aspose.pdf.Page page = doc.getPages().add();

//Instanciar um objeto de tabela que será aninhado dentro de outerTable que se quebrará
//dentro da mesma página
com.aspose.pdf.Table mytable = new com.aspose.pdf.Table();
mytable.setBroken(TableBroken.Vertical);
mytable.setDefaultCellBorder(new BorderInfo(BorderSide.All));
mytable.setRepeatingColumnsCount(2);
page.getParagraphs().add(mytable);

//Adicionar Linha de Cabeçalho
com.aspose.pdf.Row row = mytable.getRows().add();
Cell cell = row.getCells().add("cabeçalho 1");
cell.setColSpan(2);
cell.setBackgroundColor(Color.getLightGray());
Cell header3 = row.getCells().add("cabeçalho 3");
Cell cell2 = row.getCells().add("cabeçalho 4");
cell2.setColSpan(2);
cell2.setBackgroundColor(Color.getLightBlue());
row.getCells().add("cabeçalho 6");
Cell cell3 = row.getCells().add("cabeçalho 7");
cell3.setColSpan(2);
cell3.setBackgroundColor(Color.getLightGreen());
Cell cell4 = row.getCells().add("cabeçalho 9");
cell4.setColSpan(3);
cell4.setBackgroundColor(Color.getLightCoral());
row.getCells().add("cabeçalho 12");
row.getCells().add("cabeçalho 13");
row.getCells().add("cabeçalho 14");
row.getCells().add("cabeçalho 15");
row.getCells().add("cabeçalho 16");
row.getCells().add("cabeçalho 17");

for (int rowCounter = 0; rowCounter < 1; rowCounter++)
{
  //Criar linhas na tabela e depois células nas linhas
  com.aspose.pdf.Row row1 = mytable.getRows().add();
  row1.getCells().add("col "+rowCounter+", 1");
  row1.getCells().add("col "+rowCounter+", 2");
  row1.getCells().add("col "+rowCounter+", 3");
  row1.getCells().add("col "+rowCounter+", 4");
  row1.getCells().add("col "+rowCounter+", 5");
  row1.getCells().add("col "+rowCounter+", 6");
  row1.getCells().add("col "+rowCounter+", 7");
  row1.getCells().add("col "+rowCounter+", 8");
  row1.getCells().add("col "+rowCounter+", 9");
  row1.getCells().add("col "+rowCounter+", 10");
  row1.getCells().add("col "+rowCounter+", 11");
  row1.getCells().add("col "+rowCounter+", 12");
  row1.getCells().add("col "+rowCounter+", 13");
  row1.getCells().add("col "+rowCounter+", 14");
  row1.getCells().add("col "+rowCounter+", 15");
  row1.getCells().add("col "+rowCounter+", 16");
  row1.getCells().add("col "+rowCounter+", 17");
}
doc.save(dataDir + "3_out.pdf");