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}));
我使用的是 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}));