diff --git a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/outputdevice/helper/BaseRendererBuilder.java b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/outputdevice/helper/BaseRendererBuilder.java index c5f515ae4..55cb0a558 100644 --- a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/outputdevice/helper/BaseRendererBuilder.java +++ b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/outputdevice/helper/BaseRendererBuilder.java @@ -626,6 +626,19 @@ public TFinalClass useExternalResourceAccessControl( return (TFinalClass) this; } + /** + * Allows the setting of the initial page number to use with the + * page and pages CSS counters. + * Useful when appending to an existing document. + * Must be one or greater. + * + * @return this for method chaining. + */ + public TFinalClass useInitialPageNumber(int initialPageNumber) { + state._initialPageNumber = initialPageNumber; + return (TFinalClass) this; + } + public enum TextDirection { RTL, LTR } diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/pr-727-initial-page-number.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/pr-727-initial-page-number.pdf new file mode 100644 index 000000000..445d4efc1 Binary files /dev/null and b/openhtmltopdf-examples/src/main/resources/visualtest/expected/pr-727-initial-page-number.pdf differ diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/html/pr-727-initial-page-number.html b/openhtmltopdf-examples/src/main/resources/visualtest/html/pr-727-initial-page-number.html new file mode 100644 index 000000000..4b66f60de --- /dev/null +++ b/openhtmltopdf-examples/src/main/resources/visualtest/html/pr-727-initial-page-number.html @@ -0,0 +1,29 @@ + + + + + + + +

Page five

+

Page six

+ + diff --git a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java index 4a91145f4..788a2e07b 100644 --- a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java +++ b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java @@ -1413,6 +1413,16 @@ public void testIssue649MultipleBgImagesPageBox() throws IOException { assertTrue(vt.runTest("issue-649-multiple-bg-images-page-box")); } + /** + * Tests setting an initial page number with CSS page and pages counters. + */ + @Test + public void testPr727InitialPageNumber() throws IOException { + assertTrue(vt.runTest("pr-727-initial-page-number", builder -> { + builder.useInitialPageNumber(5); + })); + } + // TODO: // + Elements that appear just on generated overflow pages. // + content property (page counters, etc) diff --git a/openhtmltopdf-java2d/src/main/java/com/openhtmltopdf/java2d/api/Java2DRendererBuilder.java b/openhtmltopdf-java2d/src/main/java/com/openhtmltopdf/java2d/api/Java2DRendererBuilder.java index 1c12f1bd5..5001d532a 100644 --- a/openhtmltopdf-java2d/src/main/java/com/openhtmltopdf/java2d/api/Java2DRendererBuilder.java +++ b/openhtmltopdf-java2d/src/main/java/com/openhtmltopdf/java2d/api/Java2DRendererBuilder.java @@ -37,17 +37,6 @@ public Java2DRendererBuilder useLayoutGraphics(Graphics2D g2d) { return this; } - /** - * Used to set an initial page number for use with page counters, etc. - * - * @param pageNumberInitial - * @return this for method chaining - */ - public Java2DRendererBuilder useInitialPageNumber(int pageNumberInitial) { - state._initialPageNumber = pageNumberInitial; - return this; - } - /** * Whether to use fonts available in the environment. Enabling environment fonts may mean different text * rendering behavior across different environments. The default is not to use environment fonts. diff --git a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxRenderer.java b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxRenderer.java index 0b4dfd53f..6a7ba8a3d 100644 --- a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxRenderer.java +++ b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxRenderer.java @@ -138,7 +138,9 @@ public class PdfBoxRenderer implements Closeable, PageSupplier { private PageSupplier _pageSupplier; private final Closeable diagnosticConsumer; - + + private final int _initialPageNumber; + /** * This method is constantly changing as options are added to the builder. */ @@ -269,6 +271,8 @@ else if (doc.file != null) { } this._os = state._os; + + this._initialPageNumber = state._initialPageNumber; } public Document getDocument() { @@ -477,7 +481,7 @@ public void createPDF(OutputStream os, boolean finish) throws IOException { @Deprecated public void createPDF(OutputStream os, boolean finish, int initialPageNo) throws IOException { if (_useFastMode) { - createPdfFast(finish); + createPdfFast(finish, initialPageNo); return; } @@ -493,7 +497,7 @@ public void createPDF(OutputStream os, boolean finish, int initialPageNo) throws RenderingContext c = newRenderingContext(); c.setInitialPageNo(initialPageNo); - + PageBox firstPage = pages.get(0); Rectangle2D firstPageSize = new Rectangle2D.Float(0, 0, firstPage.getWidth(c) / _dotsPerPoint, @@ -523,7 +527,7 @@ public void createPDF(OutputStream os, boolean finish, int initialPageNo) throws /** * Go fast! */ - private void createPdfFast(boolean finish) throws IOException { + private void createPdfFast(boolean finish, int initialPageNo) throws IOException { boolean success = false; XRLog.log(Level.INFO, LogMessageId.LogMessageId0Param.GENERAL_PDF_USING_FAST_MODE); @@ -537,7 +541,7 @@ private void createPdfFast(boolean finish) throws IOException { List pages = _root.getLayer().getPages(); RenderingContext c = newRenderingContext(); - c.setInitialPageNo(0); + c.setInitialPageNo(initialPageNo != 0 ? initialPageNo : _initialPageNumber); c.setFastRenderer(true); PageBox firstPage = pages.get(0); @@ -596,6 +600,7 @@ private void writePDFFast(List pages, RenderingContext c, Rectangle2D f int pageCount = _root.getLayer().getPages().size(); c.setPageCount(pageCount); + firePreWrite(pageCount); // opportunity to adjust meta data setDidValues(doc); // set PDF header fields from meta data