如何获取在 IText 7 中写入的行数

How to get the number of lines written in IText 7

我正在从 IText 5 升级到 IText 7。下面的代码来自版本 5,它具有获取实际写入行数的方法。我如何使用 IText 7 完成相同的操作?

Paragraph p = new Paragraph(veryLongText, font);  
ColumnText column1 = new ColumnText(writer.DirectContent);
column1.SetSimpleColumn(bottomX, bottomY, topX, 100);
column1.AddElement(p);
column1.Go(true);

noOfLines = column1.LinesWritten; <---- No of Lines 

iText 7 中的布局机制比 iText 5 中的机制复杂得多且功能丰富,并且在许多复杂的布局情况下,书写行的概念可能非常基于意见。这就是布局引擎不维护写入行数且不可查询的原因。但是,很容易扩展 elements/renderers 以支持计算写入行数。这是如何做的。首先,您需要覆盖 Paragraph 来汇总行数,并覆盖 ParagraphRenderer 来提供写回 Paragraph:

的行信息
private static class LineCountingParagraph extends Paragraph {
    private int linesWritten = 0;

    public LineCountingParagraph(String text) {
        super(text);
    }

    public void addWrittenLines(int toAdd) {
        linesWritten += toAdd;
    }

    public int getNumberOfWrittenLines() {
        return linesWritten;
    }

    @Override
    protected IRenderer makeNewRenderer() {
        return new LineCountingParagraphRenderer(this);
    }
}

private static class LineCountingParagraphRenderer extends ParagraphRenderer {
    public LineCountingParagraphRenderer(LineCountingParagraph modelElement) {
        super(modelElement);
    }

    @Override
    public void drawChildren(DrawContext drawContext) {
        ((LineCountingParagraph)modelElement).addWrittenLines(lines.size());
        super.drawChildren(drawContext);
    }

    @Override
    public IRenderer getNextRenderer() {
        return new LineCountingParagraphRenderer((LineCountingParagraph) modelElement);
    }
}

现在,只需使用自定义的 类 而不是标准的 DocumentCanvas:

添加元素后查询信息
LineCountingParagraph p = new LineCountingParagraph("text");
document.add(p);
System.out.println(p.getNumberOfWrittenLines());

请注意,此机制还允许您计算满足某些条件的写入行数。您可以分析 lines 列表中的元素。