我想了解有关PdfPCell中文本布局的信息。我知道BaseFont.getWidthPointKerned(),但我正在寻找更详细的信息,如:
如果在给定宽度(例如30pt)的单元格中渲染,字符串需要多少行? PdfPCell的高点是多少?
给我一个适合给定宽度和高度的单元格的字符串的前缀或后缀。也就是说,如果我必须在宽度为12pt,高度为20pt的PdfPCell中以特定字体呈现文本“今天是美好的一天”,那么该字符串的哪一部分将适合可用空间?
< / LI>当要求在给定宽度的单元格中呈现给定字符串时,iText会在哪里中断?
这与iText 2.1.6有关。感谢。
答案 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