1

我使用 itext 7 及其 ColumnDocumentRenderer 创建了文档。我想将一些文本强制放入最后一列。“最后一列”是指例如,如果我有一个由 ColumnDocumentRenderer 定义的具有 3 列的页面,但我只有一列文本,我仍然希望第 3 列包含我的强制值。所以我想(假设一个解决方案,其他人赞赏)我需要机制来知道我所在的列号并强制分列。由于 StackOverflow 希望以问题的形式出现,(a)这些机制是什么?(b) 有哪些替代方法?

问题如何使用 iText 将文本插入点跳过到下一列?显然提出了类似的问题,但显然使用的是早期版本的 itext;我的没有我能找到的 ColumnText。

提前感谢您的帮助。

4

1 回答 1

1

我昨天是用手机接电话的,但现在我可以使用电脑了,我改变了ColumnDocumentRenderer这样的:

public class ColumnDocumentRenderer extends DocumentRenderer {

    protected Rectangle[] columns;
    protected int nextAreaNumber;

    public ColumnDocumentRenderer(Document document, Rectangle[] columns) {
        super(document);
        this.columns = columns;
    }

    public ColumnDocumentRenderer(Document document, boolean immediateFlush, Rectangle[] columns) {
        super(document, immediateFlush);
        this.columns = columns;
    }

    @Override
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        if (overflowResult != null && overflowResult.getAreaBreak() != null && overflowResult.getAreaBreak().getType() != AreaBreakType.NEXT_AREA) {
            nextAreaNumber = 0;
        }
        if (nextAreaNumber % columns.length == 0) {
            super.updateCurrentArea(overflowResult);
        }
        return (currentArea = new LayoutArea(currentPageNumber, columns[nextAreaNumber++ % columns.length].clone()));
    }

    public int getNextAreaNumber() {
        return nextAreaNumber;
    }
}

更改将在 iText 7.0.1 中进行,但您可以在自己的渲染器中使用此代码。

您现在可以像这样使用此渲染器:

public void createPdf(String dest) throws IOException {
    OutputStream fos = new FileOutputStream(dest);
    PdfWriter writer = new PdfWriter(fos);
    PdfDocument pdf = new PdfDocument(writer);
    Document document = new Document(pdf);

    float offSet = 36;
    float gutter = 23;
    float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 3 - gutter * 2;
    float columnHeight = PageSize.A4.getHeight() - offSet * 2;
    Rectangle[] columns = {
        new Rectangle(offSet, offSet, columnWidth, columnHeight),
        new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight),
        new Rectangle(offSet + 2 * (columnWidth + gutter), offSet, columnWidth, columnHeight)};
    ColumnDocumentRenderer renderer = new ColumnDocumentRenderer(document, columns);
    document.setRenderer(renderer);

    for (int i = 0; i < 50; i++) {
        document.add(new Paragraph("Hello World"));
    }
    while (renderer.getNextAreaNumber() % 3 != 0)
        document.add(new AreaBreak());
    document.add(new Paragraph("Third column"));
    document.add(new AreaBreak());
    for (int i = 0; i < 80; i++) {
        document.add(new Paragraph("Hello World"));
    }
    while (renderer.getNextAreaNumber() % 3 != 0)
        document.add(new AreaBreak());
    document.add(new Paragraph("Third column"));
    document.add(new AreaBreak());
    for (int i = 0; i < 10; i++) {
        document.add(new Paragraph("Hello World"));
    }
    while (renderer.getNextAreaNumber() % 3 != 0)
        document.add(new AreaBreak());
    document.add(new Paragraph("Third column"));
    document.close();

}

第一列的索引为 0,下一个区域编号为 1,第二列的索引为 1,下一个区域编号为 2,以此类推。

这意味着您可以检查并转到此类页面上的第三列。

while (renderer.getNextAreaNumber() % 3 != 0)
    document.add(new AreaBreak());
于 2016-06-12T05:11:06.910 回答