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

时间:2014-03-15 14:50:53

标签: java arrays for-loop

请帮助我,我的错误似乎无法使其工作,因为它只能迭代数组或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<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.");
        }
    }}

2 个答案:

答案 0 :(得分:3)

  

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

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

在您使用的代码中

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

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

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


修改

  

nodeCollection来自com.aspose.words。

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

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 )

请参阅 a similar answer on so

答案 1 :(得分:3)

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

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

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