From 1d32a695841c7c5055b0ce6ab8499005d3ad79af Mon Sep 17 00:00:00 2001 From: BenJ1337 Date: Thu, 5 Mar 2026 22:39:42 +0100 Subject: [PATCH 1/2] Fix 1509: Re-add the header and footer when newPage() is called explicitly after it was called implicitly. --- .../com/lowagie/text/pdf/PdfDocument.java | 1 + .../com/lowagie/text/pdf/PdfDocumentTest.java | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/openpdf/src/main/java/com/lowagie/text/pdf/PdfDocument.java b/openpdf/src/main/java/com/lowagie/text/pdf/PdfDocument.java index 12652b86a..f10d89801 100644 --- a/openpdf/src/main/java/com/lowagie/text/pdf/PdfDocument.java +++ b/openpdf/src/main/java/com/lowagie/text/pdf/PdfDocument.java @@ -872,6 +872,7 @@ public boolean newPage() { if (isPageEmpty()) { setNewPageSizeAndMargins(); resetText(true); + initPage(); return false; } if (!open || close) { diff --git a/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java b/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java index df6503805..29dc61819 100644 --- a/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java +++ b/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java @@ -1,12 +1,21 @@ package com.lowagie.text.pdf; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import com.lowagie.text.Document; import com.lowagie.text.Element; +import com.lowagie.text.Font; +import com.lowagie.text.HeaderFooter; +import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; +import com.lowagie.text.Phrase; +import java.io.FileOutputStream; +import java.nio.file.Path; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestFactory; class PdfDocumentTest { @@ -57,4 +66,39 @@ private List getCellElements(PdfPTable result) { return firstCell.getColumn().compositeElements; } + + + + @Test + void createPdfFileWithAutoPageBreak() throws Exception { + Path output = Path.of("openpdf-test.pdf"); + Document document = new Document(PageSize.A4); + PdfWriter writer = PdfWriter.getInstance( + document, + new FileOutputStream(output.toFile()) + ); + document.setHeader(new HeaderFooter(false, new Phrase("Header"))); + document.setFooter(new HeaderFooter(false, new Phrase("Footer"))); + document.open(); + Font font = new Font(Font.HELVETICA, 12); + + for (int i = 0; i < 50; i++) { + if (i == 37) { + document.newPage(); + } + var pdf = writer.getPdfDocument(); + var headerFielt = PdfDocument.class.getDeclaredField("text"); + headerFielt.setAccessible(true); + var text = (PdfContentByte) headerFielt.get(pdf); + assertTrue(String.valueOf(text.getInternalBuffer()).contains("Header"), + "Header not found: %d".formatted(i)); + assertTrue(String.valueOf(text.getInternalBuffer()).contains("Footer"), + "Footer not found: %d".formatted(i)); + document.add(new Paragraph( + "This is line " + i + " of a long text to force automatic page breaks.", + font + )); + } + document.close(); + } } From 22fa3fd7adc2d21c3eebe2122b94981887804bf1 Mon Sep 17 00:00:00 2001 From: BenJ1337 Date: Sat, 18 Apr 2026 18:18:35 +0200 Subject: [PATCH 2/2] Fix 1509: refactoring --- .../com/lowagie/text/pdf/PdfDocumentTest.java | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java b/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java index 29dc61819..934bbbc0e 100644 --- a/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java +++ b/openpdf/src/test/java/com/lowagie/text/pdf/PdfDocumentTest.java @@ -10,8 +10,7 @@ import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; -import java.io.FileOutputStream; -import java.nio.file.Path; +import java.io.ByteArrayOutputStream; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.DynamicTest; @@ -19,9 +18,7 @@ import org.junit.jupiter.api.TestFactory; class PdfDocumentTest { - private static final String PARAGRAPH_TEXT_1 = "Text above table"; - private static final String PARAGRAPH_TEXT_2 = "Text below table"; @TestFactory @@ -58,7 +55,7 @@ List testCreateWithAllElementsInOneCell() { DynamicTest.dynamicTest("element text should be '" + PARAGRAPH_TEXT_2 + "'", () -> assertEquals(paragraph2.toString(), getCellElements(result).get(3).getChunks().toString() - ))); + ))); } private List getCellElements(PdfPTable result) { @@ -66,37 +63,29 @@ private List getCellElements(PdfPTable result) { return firstCell.getColumn().compositeElements; } - - - @Test void createPdfFileWithAutoPageBreak() throws Exception { - Path output = Path.of("openpdf-test.pdf"); - Document document = new Document(PageSize.A4); - PdfWriter writer = PdfWriter.getInstance( - document, - new FileOutputStream(output.toFile()) - ); + final var document = new Document(PageSize.A4); + final var writer = PdfWriter.getInstance(document, new ByteArrayOutputStream()); document.setHeader(new HeaderFooter(false, new Phrase("Header"))); document.setFooter(new HeaderFooter(false, new Phrase("Footer"))); document.open(); - Font font = new Font(Font.HELVETICA, 12); for (int i = 0; i < 50; i++) { if (i == 37) { document.newPage(); } - var pdf = writer.getPdfDocument(); - var headerFielt = PdfDocument.class.getDeclaredField("text"); + final var pdf = writer.getPdfDocument(); + final var headerFielt = PdfDocument.class.getDeclaredField("text"); headerFielt.setAccessible(true); - var text = (PdfContentByte) headerFielt.get(pdf); + final var text = (PdfContentByte) headerFielt.get(pdf); assertTrue(String.valueOf(text.getInternalBuffer()).contains("Header"), "Header not found: %d".formatted(i)); assertTrue(String.valueOf(text.getInternalBuffer()).contains("Footer"), "Footer not found: %d".formatted(i)); document.add(new Paragraph( "This is line " + i + " of a long text to force automatic page breaks.", - font + new Font(Font.HELVETICA, 12) )); } document.close();