[ https://issues.apache.org/jira/browse/PDFBOX-5462?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17555939#comment-17555939 ]
Marian Ion edited comment on PDFBOX-5462 at 6/18/22 5:14 PM: ------------------------------------------------------------- I tried the application (packaged as an executable jar) with *-Xms2048m -Xmx2048m* options, it works smoothly with 2.0.26 (in fact, I remember using also older 2.0.x series versions without any problem), it crashes with 3.0.0-alpha3 displaying the following message {code} Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.util.ArrayList.<init>(ArrayList.java:156) at org.apache.pdfbox.io.RandomAccessReadBuffer.<init>(RandomAccessReadBuffer.java:132) at org.apache.pdfbox.io.RandomAccessReadBuffer.createView(RandomAccessReadBuffer.java:363) at org.apache.pdfbox.pdfparser.COSParser.createRandomAccessReadView(COSParser.java:585) at org.apache.pdfbox.cos.COSDocument.createCOSStream(COSDocument.java:185) at org.apache.pdfbox.pdfparser.COSParser.parseCOSStream(COSParser.java:914) at org.apache.pdfbox.pdfparser.COSParser.parseFileObject(COSParser.java:693) at org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(COSParser.java:615) at org.apache.pdfbox.pdfparser.COSParser.dereferenceCOSObject(COSParser.java:573) at org.apache.pdfbox.cos.COSObject.getObject(COSObject.java:121) at org.apache.pdfbox.cos.COSDictionary.getDictionaryObject(COSDictionary.java:183) at org.apache.pdfbox.pdmodel.PDPage.hasContents(PDPage.java:218) at org.apache.pdfbox.pdmodel.PDPageContentStream.<init>(PDPageContentStream.java:140) at org.apache.pdfbox.pdmodel.PDPageContentStream.<init>(PDPageContentStream.java:123) at PdfboxWatermark.addWatermark(PdfboxWatermark.java:58) at PdfboxWatermark.setWatermarkOnContent(PdfboxWatermark.java:37) at WatermarkPDF.main(WatermarkPDF.java:29) {code} I also noticed something, that might explain the OOM: - with 2.0.26 the watermarking of each page is constant time, - with 3.x the watermarking time slowly increases until it crashes (so probably some memory is not freed and accumulates) was (Author: JIRAUSER291146): I tried the application (packaged as an executable jar) with *-Xms2048m -Xmx2048m* options, it works smoothly with 2.0.26 (in fact, I remember using also older 2.0.x series versions without any problem), it crashes with 3.0.0-alpha3 displaying the following message {code} Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.util.ArrayList.<init>(ArrayList.java:156) at org.apache.pdfbox.io.RandomAccessReadBuffer.<init>(RandomAccessReadBuffer.java:132) at org.apache.pdfbox.io.RandomAccessReadBuffer.createView(RandomAccessReadBuffer.java:363) at org.apache.pdfbox.pdfparser.COSParser.createRandomAccessReadView(COSParser.java:585) at org.apache.pdfbox.cos.COSDocument.createCOSStream(COSDocument.java:185) at org.apache.pdfbox.pdfparser.COSParser.parseCOSStream(COSParser.java:914) at org.apache.pdfbox.pdfparser.COSParser.parseFileObject(COSParser.java:693) at org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(COSParser.java:615) at org.apache.pdfbox.pdfparser.COSParser.dereferenceCOSObject(COSParser.java:573) at org.apache.pdfbox.cos.COSObject.getObject(COSObject.java:121) at org.apache.pdfbox.cos.COSDictionary.getDictionaryObject(COSDictionary.java:183) at org.apache.pdfbox.pdmodel.PDPage.hasContents(PDPage.java:218) at org.apache.pdfbox.pdmodel.PDPageContentStream.<init>(PDPageContentStream.java:140) at org.apache.pdfbox.pdmodel.PDPageContentStream.<init>(PDPageContentStream.java:123) at PdfboxWatermark.addWatermark(PdfboxWatermark.java:58) at PdfboxWatermark.setWatermarkOnContent(PdfboxWatermark.java:37) at WatermarkPDF.main(WatermarkPDF.java:29) {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 > Affects Versions: 3.0.0 PDFBox > 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} > private static final PDFont PDF_FONT = PDType1Font.HELVETICA; > 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 { > ... > } > 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