混合页面级元素和列文本

时间:2019-02-20 10:28:44

标签: itext7

试图利用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);
    }
    
  • 不幸的是我得到了:

buggy render

edit:布局代码知道禁区,它只是太迟才检测到,因此最多以错误的方式渲染了一行。 y设置为260:

buggy render2

看起来文本行的顶部没有受到影响,而应该检查文本行的底部是否也没有受到影响。

我在做什么错?还有其他方法吗?为什么这不是公共/受保护的API的一部分?创建文档时,它可能非常有用。

0 个答案:

没有答案