[ 
https://issues.apache.org/jira/browse/PDFBOX-5462?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17555808#comment-17555808
 ] 

Tilman Hausherr commented on PDFBOX-5462:
-----------------------------------------

You could save memory by creating PDExtendedGraphicsState and the font outside 
of the loop (but of course this would also save memory in 2.0.26). In theory 
3.0.0 should use less memory before saving because it doesn't load the complete 
PDF in memory. Does your code abort when saving or earlier?

> 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

Reply via email to