[ 
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

Reply via email to