Marian Ion created PDFBOX-5462: ---------------------------------- Summary: 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
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} -- 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