/** * Makes a copy of an existing row. * * @param row */ public PdfPRow(PdfPRow row) { maxHeight = row.maxHeight; calculated = row.calculated; cells = new PdfPCell[row.cells.Length]; for (int k = 0; k < cells.Length; ++k) { if (row.cells[k] != null) { cells[k] = new PdfPCell(row.cells[k]); } } widths = new float[cells.Length]; System.Array.Copy(row.widths, 0, widths, 0, cells.Length); InitExtraHeights(); }
/** * Returns the height of the cell. * @return the height of the cell * @since 3.0.0 */ public float GetMaxHeight() { bool pivoted = (Rotation == 90 || Rotation == 270); Image img = this.Image; if (img != null) { img.ScalePercent(100); float refWidth = pivoted ? img.ScaledHeight : img.ScaledWidth; float scale = (Right - EffectivePaddingRight - EffectivePaddingLeft - Left) / refWidth; img.ScalePercent(scale * 100); float refHeight = pivoted ? img.ScaledWidth : img.ScaledHeight; Bottom = Top - EffectivePaddingTop - EffectivePaddingBottom - refHeight; } else { if (pivoted && HasFixedHeight()) { Bottom = Top - FixedHeight; } else { ColumnText ct = ColumnText.Duplicate(Column); float right, top, left, bottom; if (pivoted) { right = PdfPRow.RIGHT_LIMIT; top = Right - EffectivePaddingRight; left = 0; bottom = Left + EffectivePaddingLeft; } else { right = NoWrap ? PdfPRow.RIGHT_LIMIT : Right - EffectivePaddingRight; top = Top - EffectivePaddingTop; left = Left + EffectivePaddingLeft; bottom = HasFixedHeight() ? top + EffectivePaddingBottom - FixedHeight : PdfPRow.BOTTOM_LIMIT; } PdfPRow.SetColumn(ct, left, bottom, right, top); ct.Go(true); if (pivoted) { Bottom = Top - EffectivePaddingTop - EffectivePaddingBottom - ct.FilledWidth; } else { float yLine = ct.YLine; if (UseDescender) { yLine += ct.Descender; } Bottom = yLine - EffectivePaddingBottom; } } } float height = Height; if (height < FixedHeight) { height = FixedHeight; } else if (height < MinimumHeight) { height = MinimumHeight; } return(height); }
/** * Splits a row to newHeight. * The returned row is the remainder. It will return null if the newHeight * was so small that only an empty row would result. * * @param new_height the new height * @return the remainder row or null if the newHeight was so small that only * an empty row would result */ public PdfPRow SplitRow(PdfPTable table, int rowIndex, float new_height) { PdfPCell[] newCells = new PdfPCell[cells.Length]; float[] fixHs = new float[cells.Length]; float[] minHs = new float[cells.Length]; bool allEmpty = true; for (int k = 0; k < cells.Length; ++k) { float newHeight = new_height; PdfPCell cell = cells[k]; if (cell == null) { int index = rowIndex; if (table.RowSpanAbove(index, k)) { newHeight += table.GetRowHeight(index); while (table.RowSpanAbove(--index, k)) { newHeight += table.GetRowHeight(index); } PdfPRow row = table.GetRow(index); if (row != null && row.GetCells()[k] != null) { newCells[k] = new PdfPCell(row.GetCells()[k]); newCells[k].ConsumeHeight(newHeight); newCells[k].Rowspan = row.GetCells()[k].Rowspan - rowIndex + index; allEmpty = false; } } continue; } fixHs[k] = cell.FixedHeight; minHs[k] = cell.MinimumHeight; Image img = cell.Image; PdfPCell newCell = new PdfPCell(cell); if (img != null) { if (newHeight > cell.EffectivePaddingBottom + cell.EffectivePaddingTop + 2) { newCell.Phrase = null; allEmpty = false; } } else { float y; ColumnText ct = ColumnText.Duplicate(cell.Column); float left = cell.Left + cell.EffectivePaddingLeft; float bottom = cell.Top + cell.EffectivePaddingBottom - newHeight; float right = cell.Right - cell.EffectivePaddingRight; float top = cell.Top - cell.EffectivePaddingTop; switch (cell.Rotation) { case 90: case 270: y = SetColumn(ct, bottom, left, top, right); break; default: y = SetColumn(ct, left, bottom, cell.NoWrap ? RIGHT_LIMIT : right, top); break; } int status; status = ct.Go(true); bool thisEmpty = (ct.YLine == y); if (thisEmpty) { newCell.Column = ColumnText.Duplicate(cell.Column); ct.FilledWidth = 0; } else if ((status & ColumnText.NO_MORE_TEXT) == 0) { newCell.Column = ct; ct.FilledWidth = 0; } else { newCell.Phrase = null; } allEmpty = (allEmpty && thisEmpty); } newCells[k] = newCell; cell.FixedHeight = newHeight; } if (allEmpty) { for (int k = 0; k < cells.Length; ++k) { PdfPCell cell = cells[k]; if (cell == null) { continue; } if (fixHs[k] > 0) { cell.FixedHeight = fixHs[k]; } else { cell.MinimumHeight = minHs[k]; } } return(null); } CalculateHeights(); PdfPRow split = new PdfPRow(newCells); split.widths = (float[])widths.Clone(); split.CalculateHeights(); return(split); }