Error: can only iterate through an array or an instance of java.lang.Iterable

please help me with my error, it seems it cannot make it work, because it can only iterate over an array or an instance of java.lang.Iterable. I want to create a barcode and read it and add it to the word document

Update message . nodeCollection - from com.aspose.words.

import com.aspose.barcode.*; import com.aspose.barcoderecognition.BarCodeReadType; import com.aspose.barcoderecognition.BarCodeReader; import com.aspose.words.Document; import com.aspose.words.DocumentBuilder; import com.aspose.words.ImageType; import com.aspose.words.NodeCollection; import com.aspose.words.NodeType; import com.aspose.words.Shape; try { // Generate barcode image BarCodeBuilder builder = new BarCodeBuilder(); builder.setSymbologyType(Symbology.Code39Standard); builder.setCodeText("test-123"); String strBarCodeImageSave = "img.jpg"; builder.save(strBarCodeImageSave); // Add the image to a Word doc Document doc = new Document(); DocumentBuilder docBuilder = new DocumentBuilder(doc); docBuilder.insertImage(strBarCodeImageSave); String strWordFile = "docout.doc"; doc.save(strWordFile); // Recognition part // Extract image from the Word document NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false); int imageIndex = 0; for(Shape shape: shapes) { if (shape.hasImage()) { // If this shape is an image, extract image to file String extension = ImageTypeToExtension(shape.getImageData().getImageType()); String imageFileName = MessageFormat.format("Image.ExportImages.{0} Out.{1}", imageIndex, extension); String strBarCodeImageExtracted = "" + imageFileName; shape.getImageData().save(strBarCodeImageExtracted); // Recognize barcode from this image BarCodeReader reader = new BarCodeReader((BufferedImage) Toolkit.getDefaultToolkit().getImage(strBarCodeImageExtracted),BarCodeReadType.Code39Standard); while (reader.read()) { System.out.println("codetext: " + reader.getCodeText()); } imageIndex++; } } } catch(Exception ex) { System.out.println(ex.getMessage()); } } private static String ImageTypeToExtension(int imageType) throws Exception { switch (imageType) { case ImageType.BMP: return "bmp"; case ImageType.EMF: return "emf"; case ImageType.JPEG: return "jpeg"; case ImageType.PICT: return "pict"; case ImageType.PNG: return "png"; case ImageType.WMF: return "wmf"; default: throw new Exception("Unknown image type."); } }} 
+6
source share
2 answers

I assume that Nodecollection is com.aspose.words.NodeCollection.

If you want to use the foreach syntax, you'd better:

 Node[] shapesArray = shapes.toArray(); for (Node node : shapesArray ){ ... 
+3
source

Error: can only iterate through an array or an instance of java.lang.Iterable

It clearly states that you should iterate only objects that are iterable.

In your code you use

 NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false); ... for(Shape shape: shapes) 

The for loop fails if the shapes base class is not an instance of java.util.Collection or java.lang.Iterable .

Check if the NodeCollection a collection type class that implemented java.lang.Iterable .


Edit :

nodeCollection - from com.aspose.words.

NodeCollection implements a generic Iterable directly, without specifying the type of objects it will process. Therefore, you must explicitly generate an Iterator from the NodeCollection instance and that you can iterate.

 NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false); Iterator<Shape> shapesIterator = shapes.iterator(); ... // now use the above iterator in for loop, as below for( Shape shape: shapesIterator ) 

Refer to a similar answer to .

+3
source

All Articles