PDFBOX - заголовок на всех страницах с помощью easytable

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

2
задан Kandy 17 January 2019 в 11:26
поделиться

1 ответ

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) [1110 ]

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

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

screen shot

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

0
ответ дан mkl 17 January 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: