簡體   English   中英

刪除紙Itext7中的第一行和最后一行屬性

[英]Remove the first and last lines properties in the paper Itext7

如果t.setRise(+-)離開字段文件,則需要刪除Text(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)的行比邊緣底部多,我將其刪除。

但這是行不通的。 屬性不會刪除。

您的問題如下:渲染完成后調用drawChildren方法。 在此階段,iText通常不考慮任何元素的屬性:它只是將元素放置在其layout()階段之前已計算出的占用區域中。

您可以使用布局仿真來克服它。

讓我們將所有段落添加到div中,而不是直接添加到文檔中。 然后模擬將此div添加到文檔中:

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

在上面的代碼段中,我嘗試將div布局在A5尺寸的文檔上。

現在,您可以考慮布局的結果並更改一些元素,然后使用Document#add進行實際處理。 例如,要獲得第30個布局的段落,可以使用:

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

其他一些技巧:拆分渲染器代表iText可以放置在區域上的部分內容,即溢出-溢出的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM