PDFBOX - заголовок на всех страницах с помощью easytable - PullRequest
0 голосов
/ 17 января 2019

Я использую pdfbox и easytable https://github.com/vandeseer/easytable для создания динамических страниц, которые прекрасно работают. Но я хочу, чтобы заголовок был добавлен на всех страницах. Я сталкивался / пробовал ниже вещей.

1) Tablebuilder создается до записи строк, поэтому мы можем создать идеальный tablebuilder, поскольку строки являются динамическими.

2) Попытка вставить заголовок посередине при создании Tablebuilder, что опять-таки не идеально, так как TableDrawer делает строки достаточными в соответствии с высотой строки

Любая идея / помощь будут оценены.

Нужен вывод, аналогичный этому проекту - https://github.com/eduardohl/Paginated-PDFBox-Table-Sample. Единственная проблема здесь в том, что контент не является динамическим, как easytable.

1 Ответ

0 голосов
/ 17 января 2019

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

Однако трудно реализовать поверх easytable, потому что эта библиотека (как и многие другие) страдает от чрезмерного сокрытия данных: многие интересные переменные-члены и методы private, что расширяет классы не является жизнеспособным вариантом.

Но что вы можете сделать, это обработать строки заголовка как отдельную таблицу, которую вы рисуете снова и снова! Недостатком является двойственность настроек.

В случае кода теста TwoPagesTableTest, на который вы ссылались, его можно изменить следующим образом:

final Table.TableBuilder tableHeaderBuilder = Table.builder()
        .addColumnOfWidth(200)
        .addColumnOfWidth(200);

CellText dummyHeaderCell = CellText.builder()
        .text("Header dummy")
        .backgroundColor(Color.BLUE)
        .textColor(Color.WHITE)
        .borderWidth(1F)
        .build();

tableHeaderBuilder.addRow(
        Row.builder()
                .add(dummyHeaderCell)
                .add(dummyHeaderCell)
                .build());

Table tableHeader = tableHeaderBuilder.build();

final Table.TableBuilder tableBuilder = Table.builder()
        .addColumnOfWidth(200)
        .addColumnOfWidth(200);

CellText dummyCell = CellText.builder()
        .text("dummy")
        .borderWidth(1F)
        .build();

for (int i = 0; i < 50; i++) {
    tableBuilder.addRow(
            Row.builder()
                    .add(dummyCell)
                    .add(dummyCell)
                    .build());
}

TableDrawer drawer = TableDrawer.builder()
        .table(tableBuilder.build())
        .startX(50)
        .endY(50F) // note: if not set, table is drawn over the end of the page
        .build();

final PDDocument document = new PDDocument();

float startY = 100F;

do {
    TableDrawer headerDrawer = TableDrawer.builder()
            .table(tableHeader)
            .startX(50)
            .build();

    PDPage page = new PDPage(PDRectangle.A4);
    document.addPage(page);
    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
        headerDrawer.startY(startY);
        headerDrawer.contentStream(contentStream).draw();
        drawer.startY(startY - tableHeader.getHeight());
        drawer.contentStream(contentStream).draw();
    }

    startY = page.getMediaBox().getHeight() - 50;
} while (!drawer.isFinished());

document.save("twoPageTable-repeatingHeader.pdf");
document.close();

( RepeatingTableHeaders test createTwoPageTableRepeatingHeader)

Как видите, код сначала создает отдельный Table tableHeader, содержащий только строку заголовка. Затем эта таблица добавляется первой на каждой странице, а затем добавляется часть таблицы строк тела.

Результат: заголовки таблиц на каждой странице ...

screen shot

Слово предупреждения: Это подтверждение концепции, я проверял только код генерации таблицы из TwoPagesTableTest. Для производственного кода вы должны применить дальнейшие тесты.

...