试图利用iText7的潜力,即存在于其中,但对开发人员隐藏的潜力。我希望列中的文字在将放置在页面级(固定位置)的图像周围流动。我做错了什么,或者代码中有错误。这是我到目前为止的内容:
将文档渲染器设置为自定义ColumnDocumentRenderer:
Class<RootRenderer> cls = RootRenderer.class;
final Field f = cls.getDeclaredField("floatRendererAreas");
f.setAccessible(true);
ColumnDocumentRenderer cdr = new ColumnDocumentRenderer(document, new Rectangle[]{
new Rectangle(36f, 36f, 243.5f, 770f),
new Rectangle(315.5f, 36f, 243.5f, 770f)
}) {
@Override
protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
LayoutArea lr = super.updateCurrentArea(overflowResult);
try {
List<Rectangle> list = (List<Rectangle>) f.get(this);
list.add(new Rectangle(130f, 230f, 350f, 200f));
} catch (Exception ex) {
throw new RuntimeException(ex);
}
return lr;
}
};
document.setRenderer(cdr);
此自定义渲染器添加了一个矩形,稍后我将在其中放置图像到floatRendererAreas字段中,以便渲染器知道要避免的区域。
添加我的内容:
Div div = new Div();
div.setBackgroundColor(ColorConstants.BLUE);
div.setMargins(0f, 0f, 0f, 0f);
div.setPaddings(0f, 0f, 0f, 0f);
div.setFixedPosition(130f, 230f, 350f);
div.setHeight(200f);
document.add(div);
for (int i = 0; i < 6; i++) {
Paragraph p = new Paragraph();
p.add("Lorem ipsum...");
document.add(p);
}
不幸的是我得到了:
edit:布局代码知道禁区,它只是太迟才检测到,因此最多以错误的方式渲染了一行。 y设置为260:
看起来文本行的顶部没有受到影响,而应该检查文本行的底部是否也没有受到影响。
我在做什么错?还有其他方法吗?为什么这不是公共/受保护的API的一部分?创建文档时,它可能非常有用。