如何在多行文本周围绘制一个矩形

How to draw a rectangle around multiline text

我正在尝试在 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();