int error: исключение в потоке «main» java.lang.OutOfMemoryError: пространство кучи Java

В принципе, у вас есть два варианта: либо вы создаете документ за один раз, либо создаете документ за два прохода.

Если вы создаете документ за один раз, вы не знаете, значение Y (общее количество страниц) заранее, поэтому вам нужно создать объект PdfTemplate в качестве владельца места. Это показано в примере MovieCountries1 .

В этом примере мы создаем класс TableHeader, который расширяет PdfPageEventHelper. Мы создаем экземпляр класса PdfTemplate для total в методе OnOpenDocument(), мы используем этот заполнитель total в методе OnEndPage(), где добавляем верхний или нижний колонтитул, и мы заполняем общее число страниц в методе OnCloseDocument().

Недостатком такого подхода является то, что его трудно предсказать размеры, необходимые для total. Преимущество состоит в том, что вы можете создать документ за один раз (вам не нужно сначала создавать документ в памяти).

Если вы создаете документ за два прохода, вы создаете документ без заголовка / а затем вы просматриваете документ, чтобы узнать, сколько страниц он содержит. Затем вы используете PdfStamper для добавления номеров страниц на каждую страницу. Это показано в примере TwoPasses .

Эти примеры взяты из моей книги «iText in Action - Second Edition». Вы можете загрузить главу 6 бесплатно с этого URL-адреса: http://manning.com/lowagie2/samplechapter6.pdf

Обратитесь к официальной документации [ ]] [4], когда вы сомневаетесь в конкретной функциональности.

Обновление: я не понимаю, почему вы предпочитаете смотреть на неофициальные примеры. Пример, который я вам дал, выглядит следующим образом:

using (PdfStamper stamper = new PdfStamper(reader, ms2)) {
    // Loop over the pages and add a header to each page
    int n = reader.NumberOfPages;
    for (int i = 1; i <= n; i++) {
        // Add content
    }
}

Однако по какой-то причине вы Googled пример, который намного сложнее (и переполняет то, что вам нужно).

Просто замените // Add content с:

ColumnText.ShowTextAligned(stamper.GetUnderContent(), Element.ALIGN_CENTER, new Phrase((i + 1) + "/" + totalPages, fontetexto), 297f, 15f, 0);

Обратите внимание, что я адаптировал значение x в методе ShowTextAligned(). Вы создаете страницу размером A4, что означает, что ваша страница имеет 595 пользовательских единиц. Если вы добавите номера страниц в позиции x = 820, нижний колонтитул будет добавлен, но он будет находиться за пределами видимой области страницы. Пожалуйста, не копируйте и не вставляйте код, не зная параметров каждого метода.

-9
задан Jim L 29 January 2018 в 16:57
поделиться