Удалите свойства первой и последней строк в статье Itext7 - PullRequest
0 голосов
/ 29 мая 2019

Мне нужно удалить свойство в Text (setRise), если t.setRise (+ -) выходит из поля бумаги.enter image description here

    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) больше, чем поле bottom, я удаляю его.

Но это не работает.Свойства не удаляются.

1 Ответ

2 голосов
/ 29 мая 2019

Ваша проблема в следующем: 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);

Еще несколько советов: split renderer представляет часть контента, которую iText может разместить в области, overflow - контент, который переполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...