如何围绕多行文本绘制矩形

我想在iText中围绕多行文字绘制一个矩形。

用户将能够输入一些文本行。 文本的字体大小可能不同,可以格式化(粗体,带下划线的…)。

我用这段代码来绘制文字:

ColumnText ct = new ColumnText(cb); Phrase phrase = new Phrase("Some String\nOther string etc...\n test"); ct.setSimpleColumn(myText......); ct.addElement(phrase); ct.go(); 

我知道如何绘制一个矩形,但是我无法绘制一个勾勒出这个文本的矩形。

听起来好像你只缺少一块拼图来满足你的要求。 那件作品叫做getYLine()

请看一下DrawRectangleAroundText示例。 此示例两次绘制相同的段落。 第一次,它添加了一个看起来像你已经拥有的解决方案的矩形。 第二次,它以你希望它看起来的方式添加一个矩形:

在此处输入图像描述

第一次,我们添加如下文本:

 ColumnText ct = new ColumnText(cb); ct.setSimpleColumn(120f, 500f, 250f, 780f); Paragraph p = new Paragraph("This is a long paragraph that doesn't" + "fit the width we defined for the simple column of the" + "ColumnText object, so it will be distributed over several" + "lines (and we don't know in advance how many)."); ct.addElement(p); ct.go(); 

您可以使用坐标定义列:

 llx = 120; lly = 500; urx = 250; ury = 780; 

这是一个左下角(120,500),宽度为130,高度为380的矩形。因此,您可以绘制如下矩形:

 cb.rectangle(120, 500, 130, 280); cb.stroke(); 

不幸的是,那个矩形太大了。

现在让我们在稍微不同的坐标处再次添加文本:

 ct = new ColumnText(cb); ct.setSimpleColumn(300f, 500f, 430f, 780f); ct.addElement(p); ct.go(); 

我们不使用(300,500)作为矩形的左下角,而是使用getYLine()方法向ct对象询问其当前的Y位置:

 float endPos = ct.getYLine() - 5; 

如您所见,我减去5个用户单位,否则我的矩形的底线将与最后一行文本的基线重合,这看起来不太好。 现在我可以使用endPos值来绘制我的矩形,如下所示:

 cb.rectangle(300, endPos, 130, 780 - endPos); cb.stroke();