如何在多行文本周围绘制一个矩形
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();
我正在尝试在 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();