如何围绕多行文字绘制一个矩形

时间:2015-03-13 17:01:30

标签: java pdf itext draw

我想在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();

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

1 个答案:

答案 0 :(得分:3)

听起来好像你只缺少一块拼图来满足你的要求。这件作品被称为getYLine()

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

enter image description here

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

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)作为矩形的左下角,而是使用ct方法询问getYLine()对象的当前Y位置:

float endPos = ct.getYLine() - 5;

正如您所看到的,我减去了5个用户单位,否则我的矩形的底线将与最后一行文字的基线重合,并且看起来不是很好。现在我可以使用endPos值来绘制我的矩形:

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