简体   繁体   中英

ArrayOutOfBoundsException while reading Image from Disk

At the moment I'm trying to print some pdfs in java. The used api is Apache PDF Box in Version 2.0. After converting the images I write them to disk to save memory. In the next step I read them again and write the title in the head of the image. After that I write them again. To use them I read them again separatly. When I read them for the last time I get the following exception every 200-300 images:

java.lang.IndexOutOfBoundsException: off < 0 || len < 0 || off+len > b.length || off+len < 0!
at javax.imageio.stream.MemoryCacheImageInputStream.read(MemoryCacheImageInputStream.java:100)
  at com.sun.imageio.plugins.common.SubImageInputStream.read(SubImageInputStream.java:61)
  at com.sun.imageio.plugins.common.InputStreamAdapter.read(InputStreamAdapter.java:47)
  at java.io.SequenceInputStream.read(SequenceInputStream.java:207)
  at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238)
  at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
  at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
  at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
  at java.io.FilterInputStream.read(FilterInputStream.java:83)
  at com.sun.imageio.plugins.png.PNGImageReader.decodePass(PNGImageReader.java:1104)
  at com.sun.imageio.plugins.png.PNGImageReader.decodeImage(PNGImageReader.java:1215)
  at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1330)
  at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1606)
  at javax.imageio.ImageIO.read(ImageIO.java:1448)
  at javax.imageio.ImageIO.read(ImageIO.java:1400)
  at my.code.Class.method()

I use the following code to convert the PDFs:

            final HashMap<Integer, File> images = new HashMap<>();
            PDDocument document = PDDocument.load(sourceFile);

            PDFRenderer pdfRenderer = new PDFRenderer(document);
            final ExecutorService service = Executors.newFixedThreadPool(4);
            for (int page = 0; page < document.getNumberOfPages(); ++page)
            {
                final int finalPageNumber = page;
                Runnable r = () -> {
                    try
                    {
                        //Java could only print with 72 dpi so I'll use it
                        BufferedImage image = pdfRenderer.renderImageWithDPI(finalPageNumber, 72);
                        File imageFile = new File(sourceFile.getAbsolutePath() + "-" + (finalPageNumber + 1) + ".png");
                        ImageIO.write(image, "png", imageFile);
                        image.flush();
                        images.put(finalPageNumber, imageFile);
                    }
                    catch (final IOException e)
                    {
                        e.printStackTrace();
                    }
                };
                Thread t = new Thread(r, page + "");
                t.setName("" + page);
                service.submit(t);
            }

And for reading is the following code used:

           // example url: /tmp/example.pdf-17.png
           Image i = ImageIO.read(url);

What about to solve this Problem

Thanks in advance

Daniel Brenzel


edit

What I've forgotten to say I add a Title manualy to the Image:

                BufferedImage bimage = new BufferedImage(   simple.getValue().getWidth(null),
                                                                        simple.getValue().getHeight(null) + 50,
                                                                        BufferedImage.TYPE_INT_ARGB);
                Graphics bGr = bimage.createGraphics();
                bGr.setColor(Color.WHITE);
                bGr.fillRect(0, 0, bimage.getWidth(), bimage.getHeight());
                bGr.setFont(new Font("Arial", Font.PLAIN, 15));
                bGr.setColor(Color.BLACK);
                bGr.drawImage(simple.getValue(), 0, 50, null);
                bGr.drawString(entry.getValue(), 20, 20);
                try
                {
                    ImageIO.write(bimage, "PNG", new File(simple.getKey().toURI()));
                }
                catch (IOException | URISyntaxException e)
                {                       
                    e.printStackTrace();
                }
                bGr.dispose();

And here are the links to the files (It could occour with every page):

Image wich throw the exception

PDF file wich is used (generated by Word2007)

I have solved my Problem. I hadn't wait for the writing of the Image. Now I wait for the finish of the ExecutorService and everything works fine.

I think there was a problem to free resources, since I've seen that at MemoryCacheImageInputStream line 100 every thing was fine when the exception was thrown.

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