Создайте таблицу с повторяющимся заголовком с помощью iText - PullRequest
0 голосов
/ 22 мая 2018

Я хочу создать таблицу с повторяющимися заголовками, как изображение, которое я прикрепил к своему сообщению.

Я хочу заполнить первые три столбца слева до конца таблицы, а затем заполнить вторые три столбца справа от таблицы.

Я использовал одну таблицу с 6 столбцами, как показано на странице. Я получил данные из базы данных на основе порядка дат, и я хочу разместить свои данные в таблице, как на картинке.

Я могу создать таблицу с iText в Java, но я не знаю, как я могу создать таблицу с этим стилем в iText.Пожалуйста, помогите мне, если это возможно.

Table style

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Я не совсем понял, как вы хотите, чтобы ваша таблица была обработана при разбиении, и предположил, что вы ищете макет из двух столбцов.Если это так, то для вас есть предопределенный класс ColumnDocumentRenderer.Если он установлен для экземпляра документа, он позволяет расположить содержимое документа в столбцы.

Итак, я определил столбцы:

Rectangle pageSize = pdfDocument.getDefaultPageSize(); Rectangle[] areas = new Rectangle[2]; areas[0] = new Rectangle(36, 36, ((float) pageSize.getWidth() / 2) - 35.75f, pageSize.getHeight() - 72); areas[1] = new Rectangle((float) pageSize.getWidth() / 2 - 0.25f, 36, ((float) pageSize.getWidth() / 2) - 35.75f , pageSize.getHeight() - 72);

И затем я применил рендерер кЭкземпляр документа: layoutDocument.setRenderer(new ColumnDocumentRenderer(layoutDocument, areas));

Результат разделения выглядит следующим образом: enter image description here

Полный код:

    @Test
public void tableTest02() throws Exception {
    String outFileName = destinationFolder + "tableTest02.pdf";
    String cmpFileName = sourceFolder + "cmp_tableTest02.pdf";

    PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
    Document layoutDocument = new Document(pdfDocument);


    Table table = new Table(3);
    table.setWidth(UnitValue.createPercentValue(100));

    Rectangle pageSize = pdfDocument.getDefaultPageSize();
    Rectangle[] areas = new Rectangle[2];
    areas[0] = new Rectangle(36, 36, ((float) pageSize.getWidth() / 2) - 35.75f, pageSize.getHeight() - 72);
    areas[1] = new Rectangle((float) pageSize.getWidth() / 2 - 0.25f, 36, ((float) pageSize.getWidth() / 2) - 35.75f , pageSize.getHeight() - 72);

    layoutDocument.setRenderer(new ColumnDocumentRenderer(layoutDocument, areas));
    // header
    for(int i=0;i<1;i++) {
        table.addHeaderCell(new Cell().add(new Paragraph("Number")).setBackgroundColor(new DeviceRgb(74,189,172)));
        table.addHeaderCell(new Cell().add(new Paragraph("Firstname")).setBackgroundColor(new DeviceRgb(74,189,172)));
        table.addHeaderCell(new Cell().add(new Paragraph("Lastname")).setBackgroundColor(new DeviceRgb(74,189,172)));
    }

    // table
    for(int i=0;i<500;i++){

        table.addCell(new Cell().add(new Paragraph((i + 1)+"")));
        table.addCell(new Cell().add(new Paragraph("Hello")));
        table.addCell(new Cell().add(new Paragraph("World")));

    }

    layoutDocument.add(table);

    pdfDocument.close();

    Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
}

сложным моментом было сворачивание границ таблицы, но, увеличив ширину на 0,25f и переместив правый столбец на 0,25f влево, я получил границы для размещения друг на друге.

0 голосов
/ 28 мая 2018

Это относительно просто.

Сначала я создал класс, представляющий одну запись данных.

static class Record{
    public String firstname;
    public String lastname;
    public Record(String firstname, String lastname){
        this.firstname = firstname;
        this.lastname = lastname;
    }
    public String getFirstname(){return firstname;}
    public String getLastname(){return lastname;}
    public boolean equals(Object o){
        if(o instanceof Record){
            Record r = (Record) o;
            return r.firstname.equals(firstname) && r.lastname.equals(lastname);
        }
        return false;
    }
}

Я также создал метод, который случайным образом генерирует объекты такого типа, используя символыСимпсонов.

private static Random RANDOM = new Random(System.currentTimeMillis());
public Record randomRecord(){
    String[] fn = {"Marge", "Homer", "Bart", "Lisa", "Nelson", "Apu", "Doris", "Seymour"};
    String[] ln = {"Bouvier", "Simpson", "Muntz", "Nahasapeemapetilan", "Skinner"};
    return new Record(fn[RANDOM.nextInt(fn.length)], ln[RANDOM.nextInt(ln.length)]);
}

Код для создания таблицы выглядит следующим образом:

    List<Record> recordList = new ArrayList<>();
    for(int i=0;i<17;i++)
        recordList.add(randomRecord());

    File outputFile = getOutputFile();
    PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outputFile));
    Document layoutDocument = new Document(pdfDocument);

    int numberOfItemsInFirstHalf = (int) Math.ceil(recordList.size() / 2.0);

    Table table = new Table(new float[]{0.16f, 0.16f, 0.16f, 0.16f, 0.16f, 0.16f});

    // header
    for(int i=0;i<2;i++) {
        table.addCell(new Cell().add(new Paragraph("Number")).setBackgroundColor(new DeviceRgb(74,189,172)));
        table.addCell(new Cell().add(new Paragraph("Firstname")).setBackgroundColor(new DeviceRgb(74,189,172)));
        table.addCell(new Cell().add(new Paragraph("Lastname")).setBackgroundColor(new DeviceRgb(74,189,172)));
    }

    // table
    for(int i=0;i<numberOfItemsInFirstHalf;i++){
        Record r0 = recordList.get(i);
        Record r1 = (i+numberOfItemsInFirstHalf) < recordList.size() ? recordList.get(i + numberOfItemsInFirstHalf) : null;

        table.addCell(new Cell().add(new Paragraph((i + 1)+"")));
        table.addCell(new Cell().add(new Paragraph(r0.getFirstname())));
        table.addCell(new Cell().add(new Paragraph(r0.getLastname())));

        if(r1 == null){
            table.addCell(new Cell().add(new Paragraph("")));
            table.addCell(new Cell().add(new Paragraph("")));
            table.addCell(new Cell().add(new Paragraph("")));
        }else{
            table.addCell(new Cell().add(new Paragraph((i + numberOfItemsInFirstHalf + 1)+"")));
            table.addCell(new Cell().add(new Paragraph(r1.getFirstname())));
            table.addCell(new Cell().add(new Paragraph(r1.getLastname())));
        }
    }

    layoutDocument.add(table);

    pdfDocument.close();

, который генерирует следующий документ PDF:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...