亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Qyouu 2022-12-21 10:14:19
如果 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();}@Overridepublic 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,我將其刪除。但它不起作用。屬性不會刪除。
查看完整描述

1 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

您的問題如下: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 - 溢出的內容。


查看完整回答
反對 回復 2022-12-21
  • 1 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號