Itext7 ColumnDocumentRenderer 更改每页边距

Itext7 ColumnDocumentRenderer change Margin per Page

我使用的是 Itext7,我一直在尝试更改文档的左边距,但没有成功。我有两列,我希望奇数页的左边距为 30,偶数页为 50。

 PageHeaderHandler pageHeaderHandler = new PageHeaderHandler(SummaryDoc, pdfdoc, sumTable);
 pdfdoc.AddEventHandler(PdfDocumentEvent.END_PAGE, pageHeaderHandler);
 columnWidth = ((PageSize.A4.GetWidth() - offSet * 2) / 2 - gutter) + 30;
 columnHeight = PageSize.A4.GetHeight() - offSet * 2;
 Rectangle[] columns = {
                    new Rectangle(offSet, topMargin, columnWidth, columnHeight),
                    new Rectangle(offSet + columnWidth + gutter, topMargin, columnWidth, columnHeight)};
 SummaryDoc.Doc.SetRenderer(new ColumnDocumentRenderer(SummaryDoc.Doc, columns));

还有我的处理程序:

public void HandleEvent(Event @event)
{
    if (doc.CurrentPage() % 2 == 1)
    {
        doc.Doc.SetLeftMargin(30);
    }
    else
    {
        doc.Doc.SetLeftMargin(50);
    }
}

这不起作用,它适用于普通的 DocumentRenderer 但不适用于此处。有没有办法为 ColumnDocumentRenderer 设置 leftMargin?

如果您查看 ColumnDocumentRenderer 的实现,首先您会发现它没有考虑边距(边距概念可能对多个列有争议,并且对不同的人有不同的含义)和列以绝对单位定义。

但最重要的是,您可以看到 ColumnDocumentRenderer 的实现非常简单,不包含很多代码。您可以从那里获得灵感来实现您自己的渲染器,该渲染器将根据页面是奇数还是偶数使用不同的列位置。

这是此类自定义渲染器的一个非常基本的实现 class:

private static class VariableColumnDocumentRenderer extends DocumentRenderer {
    protected Rectangle[][] columns;
    protected int nextAreaNumber;
    protected int curColumnLayoutId;

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

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

所以它接受一个由列组成的数组,实际上它的用途比您需要的更灵活。它将在一页范围内在内部数组上旋转,当区域用完时将转到下一个外部数组项,依此类推。因此,在您的情况下,您可以传递奇数页和偶数页的列,并且实现将无限地旋转这些列。

如何使用此类代码的示例:

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFile));
Document doc = new Document(pdfDoc);

Rectangle[] columnsOdd = {new Rectangle(100, 100, 100, 500), new Rectangle(400, 100, 100, 500)};
Rectangle[] columnsEven = {new Rectangle(200, 100, 100, 500), new Rectangle(500, 100, 100, 500)};
doc.setRenderer(new VariableColumnDocumentRenderer(doc, new Rectangle[][] {columnsOdd, columnsEven}));