删除文件 Itext7 中的第一行和最后一行属性

Remove the first and last lines properties in the paper Itext7

我需要删除文本 (setRise) 中的 属性,如果 t.setRise(+-) 超出字段纸。

    PdfDocument pdfDoc = new PdfDocument(pdfWriter);
    Document doc = new Document(pdfDoc, PageSize.A5);
    doc.setMargins(0,0,0,36);
    for (int i = 0; i <50 ; i++) {
        Text t = new Text("hello " + i);
        if(i ==0){
            t.setTextRise(7);
        }
        if(i==31){
            t.setTextRise(-35);
        }
    Paragraph p = new Paragraph(t);
    p.setNextRenderer(new ParagraphRen(p,doc));
    p.setFixedLeading(fixedLeading);

     doc.add(p);
    }
    doc.close();
}

class ParagraphRen extends ParagraphRenderer{
private float heightDoc;
private float marginTop;
private float marginBot;



public ParagraphRen(Paragraph modelElement, Document doc) {
    super(modelElement);
    this.heightDoc =doc.getPdfDocument().getDefaultPageSize().getHeight();
    this.marginTop = doc.getTopMargin();
   this.marginBot = doc.getBottomMargin();


}

@Override
public void drawChildren(DrawContext drawContext) {
    super.drawChildren(drawContext);
    Rectangle rect = this.getOccupiedAreaBBox();
    List<IRenderer> childRenderers = this.getChildRenderers();
    //check first line
    if(rect.getTop()<=heightDoc- marginTop) {
        for (IRenderer iRenderer : childRenderers) {
            if (iRenderer.getModelElement().hasProperty(72)) {
            Object property = iRenderer.getModelElement().getProperty(72);
            float v = (Float) property + rect.getTop();
            //check text  more AreaPage
            if(v >heightDoc){
                iRenderer.getModelElement().deleteOwnProperty(72);
            }

        }
    }
    }
    //check last line
      if(rect.getBottom()-marginBot-rect.getHeight()*2<0){
        for (IRenderer iRenderer : childRenderers) {


            if (iRenderer.getModelElement().hasProperty(72)) {
                Object property = iRenderer.getModelElement().getProperty(72);


                      //if setRise(-..) more margin bottom  setRise remove
                if(rect.getBottom()-marginBot-rect.getHeight()+(Float) property<0)
                    iRenderer.getModelElement().deleteOwnProperty(72);
                }

            }
        }

    }

}

这里我检查是否第一行有 setRise 更多我删除 setRise 属性 的纸张区域。

如果最后一行 serRise(-35) 多于 margin bottom,我将其删除。

但是没用。属性不删除。

您的问题如下:drawChildren 方法在渲染完成后被调用。在这个阶段,iText 通常不考虑任何元素的属性:它只是将元素放在其占用的区域中,该区域已经在 layout() 阶段计算过。

您可以通过布局仿真来克服它。

让我们将所有段落添加到 div 而不是直接添加到文档中。然后模拟将此 div 添加到文档中:

LayoutResult result = div.createRendererSubTree().setParent(doc.getRenderer()).layout(new LayoutContext(new LayoutArea(0, PageSize.A5)));

在上面的代码片段中,我尝试在 A5 尺寸的文档上布置 div。

现在您可以考虑布局的结果并更改一些元素,然后 Document#add 将对其进行实际处理。例如,要获得第 30 个布局段落,可以使用:

((DivRenderer)result.getSplitRenderer()).getChildRenderers().get(30);

更多提示: split renderer 表示 iText 可以放置在区域上的部分内容,overflow - 溢出的内容。