iText - 如何获取文本的渲染尺寸?

时间:2014-02-28 11:10:29

标签: itext

我想了解有关PdfPCell中文本布局的信息。我知道BaseFont.getWidthPointKerned(),但我正在寻找更详细的信息,如:

  1. 如果在给定宽度(例如30pt)的单元格中渲染,字符串需要多少行? PdfPCell的高点是多少?

  2. 给我一​​个适合给定宽度和高度的单元格的字符串的前缀或后缀。也就是说,如果我必须在宽度为12pt,高度为20pt的PdfPCell中以特定字体呈现文本“今天是美好的一天”,那么该字符串的哪一部分将适合可用空间?

    < / LI>
  3. 当要求在给定宽度的单元格中呈现给定字符串时,iText会在哪里中断?

  4. 这与iText 2.1.6有关。感谢。

1 个答案:

答案 0 :(得分:0)

iText使用ColumnText类将内容呈现给单元格。我在第98-99页的书中对此进行了解释。这意味着,与ColumnText一样,您需要区分文本模式复合模式

在任何情况下,ColumnText都会测量字符的宽度,并测试它们是否适合可用的宽度。如果不是,则分割文本。您可以通过不同的方式更改拆分行为:通过引入连字符或定义自定义拆分字符。

我写了一个小概念证明来展示如何实现自定义“截断”行为。请参阅TruncateTextInCell示例。

我没有将内容添加到单元格,而是有一个空单元格,我为其定义了一个单元格事件。我将长文"D2 is a cell with more content than we can fit into the cell."传递给此活动。

在这种情况下,我使用了一种奇特的算法:我希望文本在中间被截断,并在我截断文本的地方插入“...”。

BaseFont bf = BaseFont.createFont();
Font font = new Font(bf, 12);
float availableWidth = position.getWidth();
int contentLength = content.length();
int leftChar = 0;
int rightChar = contentLength - 1;
availableWidth -= bf.getWidthPoint("...", 12);
while (leftChar < contentLength && rightChar != leftChar) {
    availableWidth -= bf.getWidthPoint(content.charAt(leftChar), 12);
    if (availableWidth > 0)
        leftChar++;
    else
        break;
    availableWidth -= bf.getWidthPoint(content.charAt(rightChar), 12);
    if (availableWidth > 0)
        rightChar--;
    else
        break;
    }
    String newContent = content.substring(0, leftChar) + "..." + content.substring(rightChar);
    PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
    ColumnText ct = new ColumnText(canvas);
    ct.setSimpleColumn(position);
    ct.addElement(new Paragraph(newContent, font));
    ct.go();

正如您所看到的,我们从position参数中获取可用宽度,并检查有多少字符匹配,在开头的字符和内容末尾的字符之间交替。

结果显示在the resulting PDF中:内容被截断为:"D2 is a c... the cell."

关于“多少行”的问题可以用类似的方式解决。 ColumnText类具有getLinesWritten()方法,可为您提供该信息。您可以在我对其他问题的回答中找到有关定位ColumnText对象的更多信息:Can I tell iText how to clip text to fit in a cell