ITextPdf PdfWriter.getPageNumber() возвращает дополнительный номер страницы

#pdf #itext

#PDF #itext

Вопрос:

Рассматривая многие примеры кода Java в моей организации, в Интернете, а также примеры из iTextPdf, существует обычная схема вычитания 1 из возвращаемого количества страниц, например: numberOfPages = writer.getPageNumber() — 1; // writer имеет тип PdfWriter, выглядит как iTextPdfрассматривает потенциально следующую страницу, независимо от того, существует она или нет. Для меня это не имеет большого смысла, но это работает.

  • Действительно ли getPageNumber() последовательно добавляет 1 к количеству страниц?
  • Могу ли я получить больше информации об этом? (мы используем iText 5.5.6)

Контекст, когда это происходит, заключается в использовании getPageNumber() в onCloseDocument() методе события страницы, чтобы получить общее количество страниц. В этом случае возвращаемое значение превышает число на единицу.

Комментарии:

1. Это зависит от контекста. Без этого контекста ответ не может быть предоставлен.

2. Спасибо, Бруно, за твой ответ. Контекст заключается в том, что код переопределяет onCloseDocument(), чтобы получить общее количество страниц, а затем мы обнаруживаем, что ответ превышает число на единицу.

3. В этом случае я могу (и буду) ответить на вопрос.

Ответ №1:

Этот ответ предназначен только для iText 5; iText 7 использует совершенно другой подход.

  • Когда вы закрываете документ в iText 5, iText всегда вызывает newPage() метод для завершения последней страницы в документе. newPage() Метод также инициализирует новую страницу, но поскольку после закрытия документа содержимое не может быть добавлено, эта новая страница будет пустой и никогда не появится в вашем документе (поскольку пустые страницы игнорируются). Во время инициализации новой страницы, которая никогда не будет существовать полностью, количество страниц увеличивается на единицу.
  • Когда вы закрываете документ в iText 5, onCloseDocument() метод является одним из последних методов, который вызывается. Он вызывается после newPage() использования метода, что также означает: после увеличения номера страницы на единицу.

Поэтому, когда вы используете getPageNumber() метод в onCloseDocument() методе, вам нужно вычесть одну страницу.

Существует только одна причина такого странного поведения: iText вырос органично, и процесс создания PDF («5 шагов») предшествует событиям страницы. Мы не думали о добавлении событий страницы, когда iText был изначально разработан. События страницы были привязаны к исходному дизайну, и это имело некоторые последствия, такие как «проблема», о которой вы упоминаете в своем вопросе.

Как объяснялось в нашем выступлении на JavaOne «Ой, мы сломали наш API», мы решили не ломать API в течение длительного времени, даже если взлом API привел бы к большей элегантности и меньшим причудам, подобным тому, который вы упомянули. С iText 7 мы решили переписать iText с нуля (нарушая всю обратную совместимость), чтобы такого рода странные явления больше не существовали.