Если вы посмотрите на реализацию ColumnDocumentRenderer
, в первую очередь вы бы увидели, что он не принимает полей в счете (понятие рентабельности может быть спорным для нескольких столбцов и означать разные вещи для разных людей) и столбцы определены в абсолютные единицы.
Но самое главное, вы можете видеть, что реализация ColumnDocumentRenderer
довольно проста и не содержит много кода. Оттуда вы можете получить вдохновение для реализации собственного рендерера, который будет использовать разные позиции столбцов в зависимости от того, является ли страница нечетной или четной.
Вот очень базовая c реализация такого пользовательского класса рендерера:
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()));
}
}
Таким образом, он принимает массив массивов столбцов и фактически служит более гибкой цели, чем вам нужно. Он будет вращаться по внутреннему массиву в пределах одной страницы, а когда области будут исчерпаны, go перейдет к следующему внешнему элементу массива и так далее. Таким образом, в вашем случае вы можете передать столбцы для нечетных и четных страниц, и реализация будет просто вращаться по этим столбцам бесконечно.
Пример использования такого кода:
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}));