[ https://issues.apache.org/jira/browse/PDFBOX-5462?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17556064#comment-17556064 ]
Andreas Lehmkühler commented on PDFBOX-5462: -------------------------------------------- [~john75] Thanks for the sample code and file I'm afraid everything works fine for me, no exception. I've tried the following: * I've created a sample file with 512 pages using the provide script. BTW, the provided pdf sample1.pdf is quite inefficient. 3 of the 4 pages contain one image, but all pages are referencing all images within their resources. * using {{org.apache.pdfbox.examples.util.AddWatermarkText}} took 2 seconds to watermark the pdf * using your code took 12 seconds to watermark the pdf I've optimized some of your code: * use a File instead of an InputStream as input. The parser needs random access to the pdf so that the data from the input stream has to be copied somewhere temporarily. The changes in 3.0.0 made it more efficient to use a file as input * wrap the OutputStream into an BufferedStream or simply use a File as output and PDFBox will do that for you In the end your code is as fast as the example. It takes 1,5 seconds to watermark the file. I didn't use any additional JVM settings such as -Xmx and even the memory settings for the loadPDF-method aren't needed at all. I've run all test within my eclipse environment on an elderly pc (i7-3770, 16GB) using linux. The question is, what is different in your environment? What hardware are you using? > 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 > Attachments: TestPdfBox.tgz > > > 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