我想在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();
我知道如何绘制一个矩形,但我无法绘制一个勾勒此文本的矩形。
答案 0 :(得分:3)
听起来好像你只缺少一块拼图来满足你的要求。这件作品被称为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)作为矩形的左下角,而是使用ct
方法询问getYLine()
对象的当前Y位置:
float endPos = ct.getYLine() - 5;
正如您所看到的,我减去了5个用户单位,否则我的矩形的底线将与最后一行文字的基线重合,并且看起来不是很好。现在我可以使用endPos
值来绘制我的矩形:
cb.rectangle(300, endPos, 130, 780 - endPos);
cb.stroke();