You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Marian Ion (Jira)" <ji...@apache.org> on 2022/08/03 08:02:00 UTC

[jira] [Commented] (PDFBOX-5462) OutOfMemoryError when watermaking in 3.0.0-RC1

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

Marian Ion commented on PDFBOX-5462:
------------------------------------

In this case, the best is to add that information to the javadoc of the [MemoryUsageSetting#setupMixed(long)|https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.0-alpha3/org/apache/pdfbox/io/MemoryUsageSetting.html]method - or maybe better, to deprecate it stating the above arguments.

> 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
>            Assignee: Andreas Lehmkühler
>            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.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org