如果 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 - 溢出的内容。
添加回答
举报
0/150
提交
取消