简体   繁体   中英

Create PDImageXObject from InputStream

I'm trying to create PDImageXObject from huge JPEG file (20 000 x 20 000 pixels [24-bit color])

Methods:

Creates ByteArrayInputStream object and allocates more than 1GB of RAM, which causes Exception

java.lang.OutOfMemoryError: Java heap space
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77) ~[?:1.8.0_211]

Exception in line:

buf = new byte[size];

I know that the number of bytes for image processing = W * H * color bits \ 9 ;

That's why I don't want to load all file bytes at a time.

I've tried to set maximum heap size to -Xmx2G but it isn't enough. I've also tried to use methods LosslessFactory.createFromImage(...) , JPEGFactory.createFromImage(...) , but they has the same problem

Is there any way to create PDImageXObject from InputStream (fe from FileInputStream), without creating BufferedImage or byte arrays ?

Spawn a thread to run a command-line utility (eg ImageMagick ) which will reduce the size of the image to what will fit within the space on the page which you have allotted for the image.

Then load that reduced-size image.

You don't need a higher resolution image or bigger-size image than what will fit on the page.

There are also several java libraries which will do that for you without the considerable process-spawning overhead. See this Baeldung article for a quick rundown on the more popular ways to do so: Baeldung: How can I resize an image using Java? .

Of course, you'll have to experiment to see how much main memory each library uses.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM