Невозможно правильно вычислить 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);