Itext7 ColumnDocumentRenderer меняет поля на странице - PullRequest
0 голосов
/ 07 апреля 2020

Я использую 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, но не здесь. Есть ли способ установить leftMargin для ColumnDocumentRenderer?

1 Ответ

1 голос
/ 07 апреля 2020

Если вы посмотрите на реализацию 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}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...