X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=javase%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fj2se%2FCommandLineRunner.java;h=78f7626577b894049c49536a26cae8a9edcd27fa;hb=c4c6e602140cee090e8ee0ed8299d15d8a8ebde6;hp=20d674b9f3739d8319ad481d5b9505ff6fbfcc75;hpb=5a513d859b3518e56ac8af8ca7b505c420c3a888;p=zxing.git diff --git a/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java b/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java index 20d674b9..78f76265 100644 --- a/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java +++ b/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Google Inc. + * Copyright 2007 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,22 +17,33 @@ package com.google.zxing.client.j2se; import com.google.zxing.DecodeHintType; +import com.google.zxing.MonochromeBitmapSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.ReaderException; -import com.google.zxing.MonochromeBitmapSource; +import com.google.zxing.Result; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.ResultParser; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.net.URI; +import java.nio.charset.Charset; import java.util.Hashtable; /** - *

Simply attempts to decode the barcode in the image indicated by the single argument - * to this program, which may be file or a URI. The raw text is printed.

+ *

This simple command line utility decodes files, directories of files, or URIs which are passed + * as arguments. By default it uses the normal decoding algorithms, but you can pass --try_harder to + * request that hint. The raw text of each barcode is printed, and when running against directories, + * summary statistics are also displayed.

* - * @author srowen@google.com (Sean Owen), dswitkin@google.com (Daniel Switkin) + * @author Sean Owen + * @author dswitkin@google.com (Daniel Switkin) */ public final class CommandLineRunner { @@ -40,43 +51,103 @@ public final class CommandLineRunner { } public static void main(String[] args) throws Exception { - File inputFile = new File(args[0]); + Hashtable hints = null; + boolean dumpResults = false; + for (String arg : args) { + if ("--try_harder".equals(arg)) { + hints = new Hashtable(3); + hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); + } else if ("--dump_results".equals(arg)) { + dumpResults = true; + } else if (arg.startsWith("--")) { + System.out.println("Unknown command line option " + arg); + return; + } + } + for (String arg : args) { + if (!arg.startsWith("--")) { + decodeOneArgument(arg, hints, dumpResults); + } + } + } + + private static void decodeOneArgument(String argument, Hashtable hints, + boolean dumpResults) throws Exception { + + File inputFile = new File(argument); if (inputFile.exists()) { if (inputFile.isDirectory()) { int successful = 0; int total = 0; for (File input : inputFile.listFiles()) { - if (decode(input.toURI())) { + String filename = input.getName().toLowerCase(); + // Skip hidden files and text files (the latter is found in the blackbox tests). + if (filename.startsWith(".") || filename.endsWith(".txt")) { + continue; + } + Result result = decode(input.toURI(), hints); + if (result != null) { successful++; + if (dumpResults) { + dumpResult(input, result); + } } total++; } System.out.println("\nDecoded " + successful + " files out of " + total + - " successfully (" + (successful * 100 / total) + "%)"); + " successfully (" + (successful * 100 / total) + "%)\n"); } else { - decode(inputFile.toURI()); + Result result = decode(inputFile.toURI(), hints); + if (dumpResults) { + dumpResult(inputFile, result); + } } } else { - decode(new URI(args[0])); + decode(new URI(argument), hints); + } + } + + private static void dumpResult(File input, Result result) throws IOException { + String name = input.getAbsolutePath(); + int pos = name.lastIndexOf('.'); + if (pos > 0) { + name = name.substring(0, pos); + } + File dump = new File(name + ".txt"); + writeStringToFile(result.getText(), dump); + } + + private static void writeStringToFile(String value, File file) throws IOException { + Writer out = new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF8")); + try { + out.write(value); + } finally { + out.close(); } } - private static boolean decode(URI uri) throws IOException { - BufferedImage image = ImageIO.read(uri.toURL()); + private static Result decode(URI uri, Hashtable hints) throws IOException { + BufferedImage image; + try { + image = ImageIO.read(uri.toURL()); + } catch (IllegalArgumentException iae) { + throw new FileNotFoundException("Resource not found: " + uri); + } if (image == null) { System.err.println(uri.toString() + ": Could not load image"); - return false; + return null; } try { - Hashtable hints = new Hashtable(3); - hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); MonochromeBitmapSource source = new BufferedImageMonochromeBitmapSource(image); - String result = new MultiFormatReader().decode(source, hints).getText(); - System.out.println(uri.toString() + ": " + result); - return true; + Result result = new MultiFormatReader().decode(source, hints); + ParsedResult parsedResult = ResultParser.parseResult(result); + System.out.println(uri.toString() + " (format: " + result.getBarcodeFormat() + + ", type: " + parsedResult.getType() + "):\nRaw result:\n" + result.getText() + + "\nParsed result:\n" + parsedResult.getDisplayResult()); + return result; } catch (ReaderException e) { System.out.println(uri.toString() + ": No barcode found"); - return false; + return null; } }