C# Itext7 ColumnDocumentRenderer更改每页边距
我使用的是Itext7,我一直在尝试更改文档的左边距,但运气不好。我有两列,奇数第30页的左边距,偶数第50页的左边距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
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用大写字母替换方法名称中的小写首字母或多或少会起到作用