错误:只能遍历数组或java.lang.Iterable的实例

请帮助我,我的错误似乎无法使其工作,因为它只能迭代数组或java.lang.Iterable的实例。 我想创建一个条形码并阅读它并将其添加到word文档中

更新发布 nodeCollection来自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 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."); } }} 

我假设Nodecollection是一个com.aspose.words.NodeCollection。

如果您想使用foreach语法,最好:

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

错误:只能遍历数组或java.lang.Iterable的实例

它清楚地表明你应该只迭代可迭代的对象。

在您使用的代码中

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

除非shapes基类是java.util.Collectionjava.lang.Iterable的实例,否则for循环失败。

检查NodeCollection是否是实现java.lang.Iterable集合类型类。


编辑

nodeCollection来自com.aspose.words。

NodeCollection直接实现genericsIterable ,而不指定它将处理的对象的类型。 因此,您应该从NodeCollection实例显式生成Iterator ,然后您可以迭代。

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

请参阅 类似的答案