C# Itext7 ColumnDocumentRenderer更改每页边距

C# Itext7 ColumnDocumentRenderer更改每页边距,c#,itext,itext7,C#,Itext,Itext7,我使用的是Itext7,我一直在尝试更改文档的左边距,但运气不好。我有两列,奇数第30页的左边距,偶数第50页的左边距 PageHeaderHandler pageHeaderHandler = new PageHeaderHandler(SummaryDoc, pdfdoc, sumTable); pdfdoc.AddEventHandler(PdfDocumentEvent.END_PAGE, pageHeaderHandler); columnWidth = ((PageSize.A

我使用的是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
的实现非常简单,不包含太多代码。您可以从中获得灵感,实现自己的渲染器,根据页面是奇数还是偶数使用不同的列位置

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

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}));

@AyoubSalhi用大写字母替换方法名称中的小写首字母或多或少会起到作用