#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 с нуля (нарушая всю обратную совместимость), чтобы такого рода странные явления больше не существовали.