[ 
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

Reply via email to