Невозможно правильно вычислить itext PdfPTable/PdfPCell

Я столкнулся с проблемой при попытке сгенерировать PdfPTable и рассчитать его высоту, прежде чем добавить его в документ. Метод calculateHeights из PdfPTable вернул высоту, намного превышающую высоту страницы (в то время как таблица составляет около 1/4 высоты страницы), поэтому я написал метод для вычисления высоты:

protected Float getVerticalSize() throws DocumentException, ParseException, IOException {
    float overallHeight=0.0f;
    for(PdfPRow curRow : this.getPdfObject().getRows()) {
        float maxHeight = 0.0f;
        for(PdfPCell curCell : curRow.getCells()) {
            if(curCell.getHeight()>maxHeight) maxHeight=curCell.getHeight();
        }
        overallHeight+=maxHeight;
    }
    return overallHeight;
}

где getPdfObject Метод возвращает объект PdfPTable.
Используя отладчик, я обнаружил, что разность координат lly и ury (и, следовательно, высота) прямоугольника ячейки намного больше, чем она выглядит после добавления таблицы в документ (например, одна ячейка равна 20, а другая - 38, а высота выглядеть так же на странице). В ячейке нет ничего, кроме абзаца с фрагментом:

Font f = getFont();
        if (f != null) {
            int[] color = getTextColor();
            if(color != null) f.setColor(color[0],color[1],color[2]);
            ch = new Chunk(celltext, f);
            par = new Paragraph(ch);
        }
cell = new PdfPCell(par);
cell.setHorizontalAlignment(getHorizontalTextAlignment());
cell.setVerticalAlignment(getVerticalTextAlignment());

Затем к таблице добавляется ячейка и setWidthPercentage атрибут установлен в некоторое число с плавающей точкой. Что я делаю неправильно? Почему пропорции ячеек отличаются от тех, которые я вижу после создания PDF? Может я неправильно высчитываю высоту? Разве это не высота ячейки на странице PDF, строго должна быть разница между координатами lly и ury
Извините, я не показал точный код, потому что PDF генерируется из XML с использованием множества промежуточных шагов и объектов, и он не очень полезен "как есть", я думаю...
Заранее спасибо!

2 ответа

Решение

Высота таблицы, добавляемой на страницу с доступной шириной 400, отличается от высоты таблицы, добавляемой на страницу с доступной шириной 1000. Невозможно правильно измерить высоту до тех пор, пока ширина не будет определена.

Определение ширины может быть сделано путем добавления таблицы в документ. После визуализации таблицы общая высота известна.

Если вы хотите знать высоту заранее, вам нужно заранее определить ширину. Например, используя:

table.setTotalWidth(400);
table.setLockedWidth(true);

Это объясняется в TableHeight пример. В файле table_height.pdf вы видите, что iText возвращает высоту 0 до добавления таблицы и высоту 48 после добавления таблицы. Изначально iText возвращает 0, потому что нет способа определить фактическую высоту.

Затем мы берем ту же таблицу и определяем общую ширину 50 (что намного меньше, чем исходные 80% доступной ширины на странице). Теперь, когда мы вычисляем высоту таблицы с тем же содержимым, iText возвращает 192 вместо 48. Когда вы смотрите на таблицу на странице, причина разницы в высоте очевидна.

Чтобы получить динамическую высоту таблицы, мы должны установить и зафиксировать ширину таблицы. Здесь 595 - это ширина бумаги формата A4.

table.setTotalWidth(595);
table.setLockedWidth(true);
Другие вопросы по тегам