[ https://issues.apache.org/jira/browse/PDFBOX-5462?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Marian Ion updated PDFBOX-5462: ------------------------------- Description: I am using the Maven *3.0.0-RC1* version and I encounter the following error when watermarking a 5120 pages file: {quote} java.lang.OutOfMemoryError: Java heap space: failed reallocation of scalar replaced objects {quote} However, the *2.0.26* version code works without problem! The code is basically this : {code:java} memoryUsageSetting = MemoryUsageSetting.setupMixed(2 * ONE_GIGA, 40 * ONE_GIGA); //try (PDDocument pdfDocument = PDDocument.load(is, memoryUsageSetting)) { // 2.0.26 try (PDDocument pdfDocument = Loader.loadPDF(inputStream, memoryUsageSetting)) { // 3.0.0-RC1 int nbPages = addWatermark(watermarkText, pdfDocument); pdfDocument.save(os); } ... private int addWatermark(String watermarkText, PDDocument document) throws IOException { int numberOfPages = document.getNumberOfPages(); System.out.printf("Start adding watermark on a %d pages PDF document%n", numberOfPages); long start = System.nanoTime(); int pageIndex = 0; for(PDPage page : document.getPages()) { ++pageIndex; try (PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true)) { float width = page.getMediaBox().getWidth(); float height = page.getMediaBox().getHeight(); int rotation = page.getRotation(); switch(rotation) { case 90: width = page.getMediaBox().getHeight(); height = page.getMediaBox().getWidth(); cs.transform(Matrix.getRotateInstance(Math.toRadians(90), height, 0)); break; case 180: cs.transform(Matrix.getRotateInstance(Math.toRadians(180), width, height)); break; case 270: width = page.getMediaBox().getHeight(); height = page.getMediaBox().getWidth(); cs.transform(Matrix.getRotateInstance(Math.toRadians(270), 0, width)); break; default: break; } double stringWidth = (double)PDF_FONT.getStringWidth(watermarkText) / 1000 * FONT_HEIGHT; double diagonalLength = Math.sqrt((double)width * width + (double)height * height); double angle = Math.atan2(height, width); cs.transform(Matrix.getRotateInstance(angle, 0, 0)); cs.setFont(PDF_FONT, (float)FONT_HEIGHT); //cs.setRenderingMode(RenderingMode.STROKE); // for "hollow" effect PDExtendedGraphicsState gs = new PDExtendedGraphicsState(); gs.setNonStrokingAlphaConstant(0.2f); gs.setStrokingAlphaConstant(0.2f); gs.setBlendMode(BlendMode.MULTIPLY); cs.setGraphicsStateParameters(gs); // some API weirdness here. When int, range is 0..255. // when float, this would be 0..1f cs.setNonStrokingColor(0f, 0, 0); cs.setStrokingColor(0f, 0, 0); // black float x = (float)((diagonalLength - stringWidth) / 2); // "horizontal" position in rotated world float y = (float)(-FONT_HEIGHT / 4); // 4 is a trial-and-error thing, this lowers the text a bit cs.beginText(); cs.newLineAtOffset(x, y); cs.showText(watermarkText); cs.endText(); } finally { long elapsedTime = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS); if (numberOfPages > 0) { System.out.printf("Watermarking duration = %d ms, page %d/%d%n", elapsedTime, pageIndex, numberOfPages); } else { System.out.printf("Watermarking duration = %d ms%n", elapsedTime); } } } return numberOfPages; } {code} was: I am using the Maven *3.0.0-RC1* version and I encounter the following error when watermarking a 5120 pages file: {quote} java.lang.OutOfMemoryError: Java heap space: failed reallocation of scalar replaced objects {quote} However, the *2.0.26* version code works without problem! The code is basically this : {code:java} memoryUsageSetting = MemoryUsageSetting.setupMixed(2 * ONE_GIGA, 40 * ONE_GIGA); try (PDDocument pdfDocument = Loader.loadPDF(inputStream, memoryUsageSetting)) { // 3.0.0-RC1 int nbPages = addWatermark(watermarkText, pdfDocument); pdfDocument.save(os); } ... private int addWatermark(String watermarkText, PDDocument document) throws IOException { int numberOfPages = document.getNumberOfPages(); System.out.printf("Start adding watermark on a %d pages PDF document%n", numberOfPages); long start = System.nanoTime(); int pageIndex = 0; for(PDPage page : document.getPages()) { ++pageIndex; try (PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true)) { float width = page.getMediaBox().getWidth(); float height = page.getMediaBox().getHeight(); int rotation = page.getRotation(); switch(rotation) { case 90: width = page.getMediaBox().getHeight(); height = page.getMediaBox().getWidth(); cs.transform(Matrix.getRotateInstance(Math.toRadians(90), height, 0)); break; case 180: cs.transform(Matrix.getRotateInstance(Math.toRadians(180), width, height)); break; case 270: width = page.getMediaBox().getHeight(); height = page.getMediaBox().getWidth(); cs.transform(Matrix.getRotateInstance(Math.toRadians(270), 0, width)); break; default: break; } double stringWidth = (double)PDF_FONT.getStringWidth(watermarkText) / 1000 * FONT_HEIGHT; double diagonalLength = Math.sqrt((double)width * width + (double)height * height); double angle = Math.atan2(height, width); cs.transform(Matrix.getRotateInstance(angle, 0, 0)); cs.setFont(PDF_FONT, (float)FONT_HEIGHT); //cs.setRenderingMode(RenderingMode.STROKE); // for "hollow" effect PDExtendedGraphicsState gs = new PDExtendedGraphicsState(); gs.setNonStrokingAlphaConstant(0.2f); gs.setStrokingAlphaConstant(0.2f); gs.setBlendMode(BlendMode.MULTIPLY); cs.setGraphicsStateParameters(gs); // some API weirdness here. When int, range is 0..255. // when float, this would be 0..1f cs.setNonStrokingColor(0f, 0, 0); cs.setStrokingColor(0f, 0, 0); // black float x = (float)((diagonalLength - stringWidth) / 2); // "horizontal" position in rotated world float y = (float)(-FONT_HEIGHT / 4); // 4 is a trial-and-error thing, this lowers the text a bit cs.beginText(); cs.newLineAtOffset(x, y); cs.showText(watermarkText); cs.endText(); } finally { long elapsedTime = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS); if (numberOfPages > 0) { System.out.printf("Watermarking duration = %d ms, page %d/%d%n", elapsedTime, pageIndex, numberOfPages); } else { System.out.printf("Watermarking duration = %d ms%n", elapsedTime); } } } return numberOfPages; } {code} > OutOfMemoryError when watermaking in 3.0.0-RC1 > ---------------------------------------------- > > Key: PDFBOX-5462 > URL: https://issues.apache.org/jira/browse/PDFBOX-5462 > Project: PDFBox > Issue Type: Bug > Components: Rendering > Affects Versions: 3.0.0 JBIG2 > Reporter: Marian Ion > Priority: Major > > I am using the Maven *3.0.0-RC1* version and I encounter the following error > when watermarking a 5120 pages file: > {quote} java.lang.OutOfMemoryError: Java heap space: failed reallocation of > scalar replaced objects > {quote} > > However, the *2.0.26* version code works without problem! > The code is basically this : > {code:java} > memoryUsageSetting = MemoryUsageSetting.setupMixed(2 * ONE_GIGA, 40 * > ONE_GIGA); > //try (PDDocument pdfDocument = PDDocument.load(is, memoryUsageSetting)) { > // 2.0.26 > try (PDDocument pdfDocument = Loader.loadPDF(inputStream, > memoryUsageSetting)) { // 3.0.0-RC1 > int nbPages = addWatermark(watermarkText, pdfDocument); > pdfDocument.save(os); > } > ... > private int addWatermark(String watermarkText, PDDocument document) throws > IOException { > int numberOfPages = document.getNumberOfPages(); > System.out.printf("Start adding watermark on a %d pages PDF > document%n", numberOfPages); > long start = System.nanoTime(); > int pageIndex = 0; > for(PDPage page : document.getPages()) { > ++pageIndex; > try (PDPageContentStream cs = new > PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, > true, true)) { > float width = page.getMediaBox().getWidth(); > float height = page.getMediaBox().getHeight(); > int rotation = page.getRotation(); > switch(rotation) { > case 90: > width = > page.getMediaBox().getHeight(); > height = > page.getMediaBox().getWidth(); > > cs.transform(Matrix.getRotateInstance(Math.toRadians(90), height, 0)); > break; > case 180: > > cs.transform(Matrix.getRotateInstance(Math.toRadians(180), width, height)); > break; > case 270: > width = > page.getMediaBox().getHeight(); > height = > page.getMediaBox().getWidth(); > > cs.transform(Matrix.getRotateInstance(Math.toRadians(270), 0, width)); > break; > default: > break; > } > double stringWidth = > (double)PDF_FONT.getStringWidth(watermarkText) / 1000 * FONT_HEIGHT; > double diagonalLength = Math.sqrt((double)width > * width + (double)height * height); > double angle = Math.atan2(height, width); > cs.transform(Matrix.getRotateInstance(angle, 0, > 0)); > cs.setFont(PDF_FONT, (float)FONT_HEIGHT); > //cs.setRenderingMode(RenderingMode.STROKE); // > for "hollow" effect > PDExtendedGraphicsState gs = new > PDExtendedGraphicsState(); > gs.setNonStrokingAlphaConstant(0.2f); > gs.setStrokingAlphaConstant(0.2f); > gs.setBlendMode(BlendMode.MULTIPLY); > cs.setGraphicsStateParameters(gs); > // some API weirdness here. When int, range is > 0..255. > // when float, this would be 0..1f > cs.setNonStrokingColor(0f, 0, 0); > cs.setStrokingColor(0f, 0, 0); // black > float x = (float)((diagonalLength - > stringWidth) / 2); // "horizontal" position in rotated world > float y = (float)(-FONT_HEIGHT / 4); // 4 is a > trial-and-error thing, this lowers the text a bit > cs.beginText(); > cs.newLineAtOffset(x, y); > cs.showText(watermarkText); > cs.endText(); > } finally { > long elapsedTime = > TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, > TimeUnit.NANOSECONDS); > if (numberOfPages > 0) { > System.out.printf("Watermarking > duration = %d ms, page %d/%d%n", elapsedTime, pageIndex, numberOfPages); > } else { > System.out.printf("Watermarking > duration = %d ms%n", elapsedTime); > } > } > } > return numberOfPages; > } > {code} -- This message was sent by Atlassian Jira (v8.20.7#820007) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org