[
https://issues.apache.org/jira/browse/PDFBOX-5462?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Marian Ion updated PDFBOX-5462:
-------------------------------
Description:
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}
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 {
long elapsedTime =
TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
if (numberOfPages > 0) {
System.out.printf("Watermarking
duration = %d ms, page %d/%d%n", elapsedTime, pageIndex, numberOfPages);
} else {
System.out.printf("Watermarking
duration = %d ms%n", elapsedTime);
}
}
}
return numberOfPages;
}
{code}
was:
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}
memoryUsageSetting = MemoryUsageSetting.setupMixed(2 * ONE_GIGA, 40 * ONE_GIGA);
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 {
long elapsedTime =
TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
if (numberOfPages > 0) {
System.out.printf("Watermarking
duration = %d ms, page %d/%d%n", elapsedTime, pageIndex, numberOfPages);
} else {
System.out.printf("Watermarking
duration = %d ms%n", elapsedTime);
}
}
}
return numberOfPages;
}
{code}
> 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
> Components: Rendering
> Affects Versions: 3.0.0 JBIG2
> 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}
> 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 {
> long elapsedTime =
> TimeUnit.MILLISECONDS.convert(System.nanoTime() - start,
> TimeUnit.NANOSECONDS);
> if (numberOfPages > 0) {
> System.out.printf("Watermarking
> duration = %d ms, page %d/%d%n", elapsedTime, pageIndex, numberOfPages);
> } else {
> System.out.printf("Watermarking
> duration = %d ms%n", elapsedTime);
> }
> }
> }
> return numberOfPages;
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.7#820007)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]