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

Marian Ion edited comment on PDFBOX-5462 at 6/18/22 8:00 PM:
-------------------------------------------------------------

With a smaller PDF (512 pages only) it crashes when saving the result, the heap 
dump displays
{code}
main
  at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48)
  at java.nio.HeapByteBuffer.duplicate()Ljava/nio/ByteBuffer; 
(HeapByteBuffer.java:131)
  at 
org.apache.pdfbox.io.RandomAccessReadBuffer.<init>(Lorg/apache/pdfbox/io/RandomAccessReadBuffer;)V
 (RandomAccessReadBuffer.java:135)
  at 
org.apache.pdfbox.io.RandomAccessReadBuffer.createView(JJ)Lorg/apache/pdfbox/io/RandomAccessReadView;
 (RandomAccessReadBuffer.java:363)
  at 
org.apache.pdfbox.pdfparser.COSParser.createRandomAccessReadView(JJ)Lorg/apache/pdfbox/io/RandomAccessReadView;
 (COSParser.java:585)
  at 
org.apache.pdfbox.cos.COSDocument.createCOSStream(Lorg/apache/pdfbox/cos/COSDictionary;JJ)Lorg/apache/pdfbox/cos/COSStream;
 (COSDocument.java:185)
  at 
org.apache.pdfbox.pdfparser.COSParser.parseCOSStream(Lorg/apache/pdfbox/cos/COSDictionary;)Lorg/apache/pdfbox/cos/COSStream;
 (COSParser.java:914)
  at 
org.apache.pdfbox.pdfparser.COSParser.parseFileObject(Ljava/lang/Long;Lorg/apache/pdfbox/cos/COSObjectKey;)Lorg/apache/pdfbox/cos/COSBase;
 (COSParser.java:693)
  at 
org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(Lorg/apache/pdfbox/cos/COSObjectKey;Z)Lorg/apache/pdfbox/cos/COSBase;
 (COSParser.java:615)
  at 
org.apache.pdfbox.pdfparser.COSParser.dereferenceCOSObject(Lorg/apache/pdfbox/cos/COSObject;)Lorg/apache/pdfbox/cos/COSBase;
 (COSParser.java:573)
  at org.apache.pdfbox.cos.COSObject.getObject()Lorg/apache/pdfbox/cos/COSBase; 
(COSObject.java:121)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:197)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:188)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:170)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:188)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.<init>(Lorg/apache/pdfbox/pdmodel/PDDocument;Lorg/apache/pdfbox/pdfwriter/compress/CompressParameters;)V
 (COSWriterCompressionPool.java:83)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.doWriteBodyCompressed(Lorg/apache/pdfbox/cos/COSDocument;)V
 (COSWriter.java:474)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(Lorg/apache/pdfbox/cos/COSDocument;)V
 (COSWriter.java:1260)
  at 
org.apache.pdfbox.cos.COSDocument.accept(Lorg/apache/pdfbox/cos/ICOSVisitor;)V 
(COSDocument.java:402)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.write(Lorg/apache/pdfbox/pdmodel/PDDocument;Lorg/apache/pdfbox/pdmodel/interactive/digitalsignature/SignatureInterface;)V
 (COSWriter.java:1542)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.write(Lorg/apache/pdfbox/pdmodel/PDDocument;)V
 (COSWriter.java:1418)
  at 
org.apache.pdfbox.pdmodel.PDDocument.save(Ljava/io/OutputStream;Lorg/apache/pdfbox/pdfwriter/compress/CompressParameters;)V
 (PDDocument.java:1018)
  at org.apache.pdfbox.pdmodel.PDDocument.save(Ljava/io/OutputStream;)V 
(PDDocument.java:937)
  at 
PdfboxWatermark.setWatermarkOnContent(Ljava/lang/String;Ljava/io/InputStream;Ljava/io/OutputStream;)I
 (PdfboxWatermark.java:38)
  at WatermarkPDF.main([Ljava/lang/String;)V (WatermarkPDF.java:29)
{code}

With a bigger PDF (1024 pages) the last written line is
{quote}
Watermarking duration = 2475 ms, page 387/1024
Watermarking duration = 2906 ms, page 388/1024
Watermarking duration = 2912 ms, page 389/1024
java.lang.OutOfMemoryError: Java heap space
Dumping heap to HeapDump/dump.hprof ...
...
{quote}
Please note the increase processing time per page.
With 2.0.26 there's also a time processing augmentation, but slower:
{quote}
Start adding watermark on a 1024 pages PDF document
Watermarking duration = 23 ms, page 1/1024
Watermarking duration = 24 ms, page 2/1024
Watermarking duration = 25 ms, page 3/1024
...
Watermarking duration = 200 ms, page 1006/1024
Watermarking duration = 200 ms, page 1007/1024
Watermarking duration = 200 ms, page 1008/1024
Watermarking duration = 201 ms, page 1009/1024
Watermarking duration = 201 ms, page 1010/1024
Watermarking duration = 201 ms, page 1011/1024
Watermarking duration = 201 ms, page 1012/1024
Watermarking duration = 201 ms, page 1013/1024
Watermarking duration = 201 ms, page 1014/1024
Watermarking duration = 201 ms, page 1015/1024
Watermarking duration = 201 ms, page 1016/1024
Watermarking duration = 201 ms, page 1017/1024
Watermarking duration = 201 ms, page 1018/1024
Watermarking duration = 202 ms, page 1019/1024
Watermarking duration = 202 ms, page 1020/1024
Watermarking duration = 202 ms, page 1021/1024
Watermarking duration = 202 ms, page 1022/1024
Watermarking duration = 202 ms, page 1023/1024
Watermarking duration = 202 ms, page 1024/1024
{quote}

This might be another issue though.


was (Author: JIRAUSER291146):
With a smaller PDF (512 pages only) it crashes when saving the result, the heap 
dump displays
{code}
main
  at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48)
  at java.nio.HeapByteBuffer.duplicate()Ljava/nio/ByteBuffer; 
(HeapByteBuffer.java:131)
  at 
org.apache.pdfbox.io.RandomAccessReadBuffer.<init>(Lorg/apache/pdfbox/io/RandomAccessReadBuffer;)V
 (RandomAccessReadBuffer.java:135)
  at 
org.apache.pdfbox.io.RandomAccessReadBuffer.createView(JJ)Lorg/apache/pdfbox/io/RandomAccessReadView;
 (RandomAccessReadBuffer.java:363)
  at 
org.apache.pdfbox.pdfparser.COSParser.createRandomAccessReadView(JJ)Lorg/apache/pdfbox/io/RandomAccessReadView;
 (COSParser.java:585)
  at 
org.apache.pdfbox.cos.COSDocument.createCOSStream(Lorg/apache/pdfbox/cos/COSDictionary;JJ)Lorg/apache/pdfbox/cos/COSStream;
 (COSDocument.java:185)
  at 
org.apache.pdfbox.pdfparser.COSParser.parseCOSStream(Lorg/apache/pdfbox/cos/COSDictionary;)Lorg/apache/pdfbox/cos/COSStream;
 (COSParser.java:914)
  at 
org.apache.pdfbox.pdfparser.COSParser.parseFileObject(Ljava/lang/Long;Lorg/apache/pdfbox/cos/COSObjectKey;)Lorg/apache/pdfbox/cos/COSBase;
 (COSParser.java:693)
  at 
org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(Lorg/apache/pdfbox/cos/COSObjectKey;Z)Lorg/apache/pdfbox/cos/COSBase;
 (COSParser.java:615)
  at 
org.apache.pdfbox.pdfparser.COSParser.dereferenceCOSObject(Lorg/apache/pdfbox/cos/COSObject;)Lorg/apache/pdfbox/cos/COSBase;
 (COSParser.java:573)
  at org.apache.pdfbox.cos.COSObject.getObject()Lorg/apache/pdfbox/cos/COSBase; 
(COSObject.java:121)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:197)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:188)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:170)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:188)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(Ljava/util/Iterator;)V
 (COSWriterCompressionPool.java:199)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(Lorg/apache/pdfbox/cos/COSBase;)V
 (COSWriterCompressionPool.java:174)
  at 
org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.<init>(Lorg/apache/pdfbox/pdmodel/PDDocument;Lorg/apache/pdfbox/pdfwriter/compress/CompressParameters;)V
 (COSWriterCompressionPool.java:83)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.doWriteBodyCompressed(Lorg/apache/pdfbox/cos/COSDocument;)V
 (COSWriter.java:474)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(Lorg/apache/pdfbox/cos/COSDocument;)V
 (COSWriter.java:1260)
  at 
org.apache.pdfbox.cos.COSDocument.accept(Lorg/apache/pdfbox/cos/ICOSVisitor;)V 
(COSDocument.java:402)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.write(Lorg/apache/pdfbox/pdmodel/PDDocument;Lorg/apache/pdfbox/pdmodel/interactive/digitalsignature/SignatureInterface;)V
 (COSWriter.java:1542)
  at 
org.apache.pdfbox.pdfwriter.COSWriter.write(Lorg/apache/pdfbox/pdmodel/PDDocument;)V
 (COSWriter.java:1418)
  at 
org.apache.pdfbox.pdmodel.PDDocument.save(Ljava/io/OutputStream;Lorg/apache/pdfbox/pdfwriter/compress/CompressParameters;)V
 (PDDocument.java:1018)
  at org.apache.pdfbox.pdmodel.PDDocument.save(Ljava/io/OutputStream;)V 
(PDDocument.java:937)
  at 
PdfboxWatermark.setWatermarkOnContent(Ljava/lang/String;Ljava/io/InputStream;Ljava/io/OutputStream;)I
 (PdfboxWatermark.java:38)
  at WatermarkPDF.main([Ljava/lang/String;)V (WatermarkPDF.java:29)
{code}

With a bigger PDF (1024 pages) the last written line is
{quote}
Watermarking duration = 2475 ms, page 387/1024
Watermarking duration = 2906 ms, page 388/1024
Watermarking duration = 2912 ms, page 389/1024
java.lang.OutOfMemoryError: Java heap space
Dumping heap to HeapDump/dump.hprof ...
...
{quote}
Please note the increase processing time per page.
With 2.0.26 there's also a time processing augmentation, but slower:
{quote}
Start adding watermark on a 1024 pages PDF document
Watermarking duration = 23 ms, page 1/1024
Watermarking duration = 24 ms, page 2/1024
Watermarking duration = 25 ms, page 3/1024
...
Watermarking duration = 200 ms, page 1006/1024
Watermarking duration = 200 ms, page 1007/1024
Watermarking duration = 200 ms, page 1008/1024
Watermarking duration = 201 ms, page 1009/1024
Watermarking duration = 201 ms, page 1010/1024
Watermarking duration = 201 ms, page 1011/1024
Watermarking duration = 201 ms, page 1012/1024
Watermarking duration = 201 ms, page 1013/1024
Watermarking duration = 201 ms, page 1014/1024
Watermarking duration = 201 ms, page 1015/1024
Watermarking duration = 201 ms, page 1016/1024
Watermarking duration = 201 ms, page 1017/1024
Watermarking duration = 201 ms, page 1018/1024
Watermarking duration = 202 ms, page 1019/1024
Watermarking duration = 202 ms, page 1020/1024
Watermarking duration = 202 ms, page 1021/1024
Watermarking duration = 202 ms, page 1022/1024
Watermarking duration = 202 ms, page 1023/1024
Watermarking duration = 202 ms, page 1024/1024
{quote}

This might be another issue though.

I can supply the code and the base sample file (+ the script to multiply it to 
any size) if it helps.

> 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

Reply via email to