You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Tilman Hausherr (JIRA)" <ji...@apache.org> on 2014/10/07 18:37:33 UTC

[jira] [Updated] (PDFBOX-2404) OutOfMemory or/and IndexOutOfBounds while creating a pdf with lots of images

     [ https://issues.apache.org/jira/browse/PDFBOX-2404?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tilman Hausherr updated PDFBOX-2404:
------------------------------------
    Description: 
Hi Folks,
I try to create PDFs with full page images (as they come from a scanner).
First I got OutOfMemoryError(exception one) after second page (which is already not nice).  
I gave the process more memory (1G) and got the second Exception.
The code breaks around 17 pages with the second exception (IndexOutOfBounds). 
The image in this example was taken from the internet as I can not provide the original, but produces the same issue. 
Another remark - the production is quite slow...
{code}
//---------------Start Code----------
package test;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

public class PDFCreatorTest {
	public static void main(String[] args) {

		try {
			createPDF("new.pdf");
		} catch (COSVisitorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void createPDF(String pdffile) throws IOException,
			COSVisitorException {

		PDDocument doc = null;
		try {
			doc = new PDDocument();

			int tstsize = 30;
			for (int pid = 0; pid < tstsize; pid++) {

				System.out.println("Create page: " + pid + " of " + tstsize
						+ "...");
				PDPage page = new PDPage();
				doc.addPage(page);

				BufferedImage tmp_image = ImageIO
						.read(new URL(
								"http://carolhagen.files.wordpress.com/2013/06/skewed-demo_wilhomebw-page-001.jpg"));
				PDRectangle box = // page.getCropBox();
				page.getMediaBox();
				BufferedImage image = new BufferedImage(tmp_image.getWidth(),
						tmp_image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
				image.createGraphics().drawRenderedImage(tmp_image, null);

				PDXObjectImage ximage = new PDPixelMap(doc, image);

				PDPageContentStream contentStream = new PDPageContentStream(
						doc, page, true, true);

				float scale = box.getHeight() / ximage.getHeight();
				contentStream.drawXObject(ximage, 0, 0, ximage.getWidth()
						* scale, ximage.getHeight() * scale);

				contentStream.close();
				System.out.println("Page: " + pid + " created!");

				
			}
			System.out.println("Save document" + pdffile);
			doc.save(pdffile);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (doc != null) {
				doc.close();
			}

		}
	}
}

//---------------End Code-------------

//--------------------------- Exception one
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.awt.image.DataBufferByte.<init>(Unknown Source)
	at java.awt.image.Raster.createInterleavedRaster(Unknown Source)
	at java.awt.image.BufferedImage.<init>(Unknown Source)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:130)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:87)
	at test.PDFCreatorTest.createPDF(PDFCreatorTest.java:65)
	at test.PDFCreatorTest.main(PDFCreatorTest.java:34)

//-------------Exception two----------
java.lang.IndexOutOfBoundsException: Index: 141, Size: 141
	at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at org.apache.pdfbox.io.RandomAccessBuffer.seek(RandomAccessBuffer.java:110)
	at org.apache.pdfbox.io.RandomAccessFileOutputStream.write(RandomAccessFileOutputStream.java:106)
	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
	at java.io.BufferedOutputStream.flush(Unknown Source)
	at java.io.FilterOutputStream.close(Unknown Source)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:233)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:102)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:222)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:87)
	at test.PDFCreatorTest.createPDF(PDFCreatorTest.java:56)
	at test.PDFCreatorTest.main(PDFCreatorTest.java:21)
{code}

  was:
Hi Folks,
I try to create PDFs with full page images (as they come from a scanner).
First I got OutOfMemoryError(exception one) after second page (which is already not nice).  
I gave the process more memory (1G) and got the second Exception.
The code breaks around 17 pages with the second exception (IndexOutOfBounds). 
The image in this example was taken from the internet as I can not provide the original, but produces the same issue. 
Another remark - the production is quite slow...

//---------------Start Code----------
package test;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

public class PDFCreatorTest {
	public static void main(String[] args) {

		try {
			createPDF("new.pdf");
		} catch (COSVisitorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void createPDF(String pdffile) throws IOException,
			COSVisitorException {

		PDDocument doc = null;
		try {
			doc = new PDDocument();

			int tstsize = 30;
			for (int pid = 0; pid < tstsize; pid++) {

				System.out.println("Create page: " + pid + " of " + tstsize
						+ "...");
				PDPage page = new PDPage();
				doc.addPage(page);

				BufferedImage tmp_image = ImageIO
						.read(new URL(
								"http://carolhagen.files.wordpress.com/2013/06/skewed-demo_wilhomebw-page-001.jpg"));
				PDRectangle box = // page.getCropBox();
				page.getMediaBox();
				BufferedImage image = new BufferedImage(tmp_image.getWidth(),
						tmp_image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
				image.createGraphics().drawRenderedImage(tmp_image, null);

				PDXObjectImage ximage = new PDPixelMap(doc, image);

				PDPageContentStream contentStream = new PDPageContentStream(
						doc, page, true, true);

				float scale = box.getHeight() / ximage.getHeight();
				contentStream.drawXObject(ximage, 0, 0, ximage.getWidth()
						* scale, ximage.getHeight() * scale);

				contentStream.close();
				System.out.println("Page: " + pid + " created!");

				
			}
			System.out.println("Save document" + pdffile);
			doc.save(pdffile);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (doc != null) {
				doc.close();
			}

		}
	}
}

//---------------End Code-------------

//--------------------------- Exception one
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.awt.image.DataBufferByte.<init>(Unknown Source)
	at java.awt.image.Raster.createInterleavedRaster(Unknown Source)
	at java.awt.image.BufferedImage.<init>(Unknown Source)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:130)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:87)
	at test.PDFCreatorTest.createPDF(PDFCreatorTest.java:65)
	at test.PDFCreatorTest.main(PDFCreatorTest.java:34)

//-------------Exception two----------
java.lang.IndexOutOfBoundsException: Index: 141, Size: 141
	at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at org.apache.pdfbox.io.RandomAccessBuffer.seek(RandomAccessBuffer.java:110)
	at org.apache.pdfbox.io.RandomAccessFileOutputStream.write(RandomAccessFileOutputStream.java:106)
	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
	at java.io.BufferedOutputStream.flush(Unknown Source)
	at java.io.FilterOutputStream.close(Unknown Source)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:233)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:102)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:222)
	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:87)
	at test.PDFCreatorTest.createPDF(PDFCreatorTest.java:56)
	at test.PDFCreatorTest.main(PDFCreatorTest.java:21)


> OutOfMemory or/and IndexOutOfBounds while creating a pdf with lots of images
> ----------------------------------------------------------------------------
>
>                 Key: PDFBOX-2404
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-2404
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 1.8.7
>         Environment: Windows 7/ Eclipse
>            Reporter: serge zr
>
> Hi Folks,
> I try to create PDFs with full page images (as they come from a scanner).
> First I got OutOfMemoryError(exception one) after second page (which is already not nice).  
> I gave the process more memory (1G) and got the second Exception.
> The code breaks around 17 pages with the second exception (IndexOutOfBounds). 
> The image in this example was taken from the internet as I can not provide the original, but produces the same issue. 
> Another remark - the production is quite slow...
> {code}
> //---------------Start Code----------
> package test;
> import java.awt.image.BufferedImage;
> import java.io.IOException;
> import java.net.URL;
> import javax.imageio.ImageIO;
> import org.apache.pdfbox.exceptions.COSVisitorException;
> import org.apache.pdfbox.pdmodel.PDDocument;
> import org.apache.pdfbox.pdmodel.PDPage;
> import org.apache.pdfbox.pdmodel.common.PDRectangle;
> import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
> import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap;
> import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
> public class PDFCreatorTest {
> 	public static void main(String[] args) {
> 		try {
> 			createPDF("new.pdf");
> 		} catch (COSVisitorException e) {
> 			// TODO Auto-generated catch block
> 			e.printStackTrace();
> 		} catch (IOException e) {
> 			// TODO Auto-generated catch block
> 			e.printStackTrace();
> 		}
> 	}
> 	private static void createPDF(String pdffile) throws IOException,
> 			COSVisitorException {
> 		PDDocument doc = null;
> 		try {
> 			doc = new PDDocument();
> 			int tstsize = 30;
> 			for (int pid = 0; pid < tstsize; pid++) {
> 				System.out.println("Create page: " + pid + " of " + tstsize
> 						+ "...");
> 				PDPage page = new PDPage();
> 				doc.addPage(page);
> 				BufferedImage tmp_image = ImageIO
> 						.read(new URL(
> 								"http://carolhagen.files.wordpress.com/2013/06/skewed-demo_wilhomebw-page-001.jpg"));
> 				PDRectangle box = // page.getCropBox();
> 				page.getMediaBox();
> 				BufferedImage image = new BufferedImage(tmp_image.getWidth(),
> 						tmp_image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
> 				image.createGraphics().drawRenderedImage(tmp_image, null);
> 				PDXObjectImage ximage = new PDPixelMap(doc, image);
> 				PDPageContentStream contentStream = new PDPageContentStream(
> 						doc, page, true, true);
> 				float scale = box.getHeight() / ximage.getHeight();
> 				contentStream.drawXObject(ximage, 0, 0, ximage.getWidth()
> 						* scale, ximage.getHeight() * scale);
> 				contentStream.close();
> 				System.out.println("Page: " + pid + " created!");
> 				
> 			}
> 			System.out.println("Save document" + pdffile);
> 			doc.save(pdffile);
> 		} catch (Exception e) {
> 			e.printStackTrace();
> 		} finally {
> 			if (doc != null) {
> 				doc.close();
> 			}
> 		}
> 	}
> }
> //---------------End Code-------------
> //--------------------------- Exception one
> Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
> 	at java.awt.image.DataBufferByte.<init>(Unknown Source)
> 	at java.awt.image.Raster.createInterleavedRaster(Unknown Source)
> 	at java.awt.image.BufferedImage.<init>(Unknown Source)
> 	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:130)
> 	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:87)
> 	at test.PDFCreatorTest.createPDF(PDFCreatorTest.java:65)
> 	at test.PDFCreatorTest.main(PDFCreatorTest.java:34)
> //-------------Exception two----------
> java.lang.IndexOutOfBoundsException: Index: 141, Size: 141
> 	at java.util.ArrayList.rangeCheck(Unknown Source)
> 	at java.util.ArrayList.get(Unknown Source)
> 	at org.apache.pdfbox.io.RandomAccessBuffer.seek(RandomAccessBuffer.java:110)
> 	at org.apache.pdfbox.io.RandomAccessFileOutputStream.write(RandomAccessFileOutputStream.java:106)
> 	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
> 	at java.io.BufferedOutputStream.flush(Unknown Source)
> 	at java.io.FilterOutputStream.close(Unknown Source)
> 	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:233)
> 	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:102)
> 	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.createImageStream(PDPixelMap.java:222)
> 	at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.<init>(PDPixelMap.java:87)
> 	at test.PDFCreatorTest.createPDF(PDFCreatorTest.java:56)
> 	at test.PDFCreatorTest.main(PDFCreatorTest.java:21)
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)