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

Andreas Lehmkühler commented on PDFBOX-5462:
--------------------------------------------

The language settings should have any impact. I'm using different JDKs, I've 
used 1.8.0_202 in this case, but I guess that shouldn't have any impact too.

W.r.t. the 4K pages file. I won't test that. It is an 1.2GB file. If you are 
still using an InputStream the first thing PDFBox does is to copy that file 
into memory allocation 1.2GB of it. Pass the file to loadPDF instead of 
creating an InputStream first

> 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, my-pdf-test.jar
>
>
> 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