为了账号安全,请及时绑定邮箱和手机立即绑定

删除文件 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 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信