错误:只能遍历数组或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.Collection
或java.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 )
请参阅 类似的答案