请帮助我,我的错误似乎无法使其工作,因为它只能迭代数组或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.");
}
}}
答案 0 :(得分:3)
错误:只能遍历数组或java.lang.Iterable的实例
它清楚地表明你应该只迭代可迭代的对象。
在您使用的代码中
NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false);
...
for(Shape shape: shapes)
for
循环失败,除非shapes
基类是java.util.Collection
或java.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 )
答案 1 :(得分:3)
我假设Nodecollection是一个com.aspose.words.NodeCollection。
如果您想使用foreach语法,最好:
Node[] shapesArray = shapes.toArray();
for (Node node : shapesArray ){ ...