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

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

http://img3.mukewang.com/63a26c100001153804400635.jpg

  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);

            }


        }

    }

    }

    

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


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


但它不起作用。属性不会删除。


Qyouu
浏览 68回答 1
1回答

MYYA

您的问题如下:drawChildren渲染完成后调用方法。在这个阶段,iText 通常不考虑任何元素的属性:它只是将元素放在它的占用区域中,这个区域已经在这个layout()阶段计算过了。您可以通过布局仿真来克服它。让我们将所有段落添加到一个 div 而不是直接添加到文档中。然后模拟将此 div 添加到文档中:LayoutResult&nbsp;result&nbsp;=&nbsp;div.createRendererSubTree().setParent(doc.getRenderer()).layout(new&nbsp;LayoutContext(new&nbsp;LayoutArea(0,&nbsp;PageSize.A5)));在上面的代码片段中,我尝试在 A5 大小的文档上布置我们的 div。现在您可以考虑布局的结果并更改一些元素,这些元素将被真正处理Document#add。例如,要获得第 30 个布局段落,可以使用:((DivRenderer)result.getSplitRenderer()).getChildRenderers().get(30);更多提示:split renderer 表示 iText 可以放置在区域上的内容部分,overflow - 溢出的内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java