/* * Copyright 2014-2015 Robin Stuart, Robert Elliott * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package uk.org.okapibarcode; import uk.org.okapibarcode.gui.OkapiUI; import com.beust.jcommander.*; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; /** * Starts the Okapi Barcode UI. * * @author <a href="mailto:rstuart114@gmail.com">Robin Stuart</a> * @author <a href="mailto:jakel2006@me.com">Robert Elliott</a> */ public class OkapiBarcode { /** * Starts the Okapi Barcode UI. * * @param args the command line arguments */ public static void main(String[] args) { Settings settings = new Settings(); new JCommander(settings, args); if (!settings.isGuiSupressed()) { OkapiUI okapiUi = new OkapiUI(); okapiUi.setVisible(true); } else { int returnValue; returnValue = commandLine(settings); if (returnValue != 0) { System.out.println("An error occurred"); } } } private static int commandLine(Settings settings) { String inputData = settings.getInputData(); String inputFile = settings.getInputFile(); if (settings.isDisplayTypes()) { System.out.print( " 1: Code 11 54: Brazilian CepNet 97: Micro QR Code\n" + " 2: Standard 2of5 55: PDF417 98: HIBC Code 128\n" + " 3: Interleaved 2of5 56: PDF417 Trunc 99: HIBC Code 39\n" + " 4: IATA 2of5 57: Maxicode 102: HIBC Data Matrix\n" + " 6: Data Logic 58: QR Code 104: HIBC QR Code\n" + " 7: Industrial 2of5 60: Code 128-B 106: HIBC PDF417\n" + " 8: Code 39 63: AP Standard Customer 108: HIBC MicroPDF417\n" + " 9: Extended Code 39 66: AP Reply Paid 110: HIBC Codablock-F\n" + "13: EAN 67: AP Routing 112: HIBC Aztec Code\n" + "18: Codabar 68: AP Redirection 113: PZN-8\n" + "20: Code 128 70: RM4SCC 117: USPS IMpb\n" + "21: Leitcode 71: Data Matrix 128: Aztec Runes\n" + "22: Identcode 74: Codablock-F 129: Code 32\n" + "23: Code 16k 75: NVE-18 130: Comp EAN\n" + "24: Code 49 76: Japanese Post 131: Comp GS1-128\n" + "25: Code 93 77: Korea Post 132: Comp Databar-14\n" + "29: Databar-14 79: Databar-14 Stack 133: Comp Databar Ltd\n" + "30: Databar Limited 80: Databar-14 Stack Omni 134: Comp Databar Ext\n" + "31: Databar Extended 81: Databar Extended Stack 135: Comp UPC-A\n" + "32: Telepen Alpha 82: Planet 136: Comp UPC-E\n" + "34: UPC-A 84: MicroPDF 137: Comp Databar-14 Stack\n" + "37: UPC-E 85: USPS Intelligent Mail 138: Comp Databar Stack Omni\n" + "40: Postnet 87: Telepen Numeric 139: Comp Databar Ext Stack\n" + "47: MSI Plessey 89: ITF-14 140: Channel Code\n" + "50: Logmars 90: KIX Code 141: Code One \n" + "51: Pharma One-Track 92: Aztec Code 142: Grid Matrix\n" + "53: Pharma Two-Track 93: Code 32\n" ); } if (inputData.isEmpty() && inputFile.isEmpty()) { System.out.println("error: No data received, no symbol generated"); return 0; } if (inputFile.isEmpty()) { if (!(settings.isDataBinaryMode())) { inputData = escapeCharProcess(inputData); } MakeBarcode mb = new MakeBarcode(); mb.process(settings, inputData, settings.getOutputFile()); } else { processFile(settings); } return 0; } private static void processFile(Settings settings) { File name = new File(settings.getInputFile()); byte[] inputBytes; String inputData; int counter = 0; if (!(settings.isBatchMode())) { // Encode all data from selected file in one symbol try (FileInputStream fis = new FileInputStream(name)) { inputBytes = new byte[fis.available()]; fis.read(inputBytes); inputData = new String(inputBytes, "UTF-8"); MakeBarcode mb = new MakeBarcode(); mb.process(settings, inputData, settings.getOutputFile()); } catch (IOException e) { System.out.println("File Read Error"); } } else { // Encode each line of input data in a seperate symbol try (BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream(name), "UTF8"))) { while ((inputData = in.readLine()) != null) { counter++; MakeBarcode mb = new MakeBarcode(); mb.process(settings, inputData, calcFileName(settings, counter)); } } catch (UnsupportedEncodingException e) { System.out.println("Encoding exception"); } catch (IOException e) { System.out.println("File Read Error"); } } } private static String calcFileName(Settings settings, int counter) { String fileName = ""; String number; int spaces = 0; int blanks; int blankPosition; String template; number = Integer.toString(counter); if (settings.getOutputFile().equals("out.png")) { // No filename set by user template = "~~~~~.png"; } else { template = settings.getOutputFile(); } for (int i = 0; i < template.length(); i++) { switch(template.charAt(i)) { case '#': case '~': spaces++; break; } } blanks = spaces - number.length(); if (blanks < 0) { // Not enough room in template for file number System.out.println("Invalid output filename"); return "out.png"; } blankPosition = 0; for (int i = 0; i < template.length(); i++) { switch(template.charAt(i)) { case '#': if (blankPosition >= blanks) { fileName += number.charAt(blankPosition - blanks); } else { fileName += ' '; } blankPosition++; break; case '~': if (blankPosition >= blanks) { fileName += number.charAt(blankPosition - blanks); } else { fileName += '0'; } blankPosition++; break; default: fileName += template.charAt(i); break; } } return fileName; } private static String escapeCharProcess(String inputString) { String outputString = ""; int i = 0; do { if (inputString.charAt(i) == '\\') { if (i < inputString.length() - 1) { switch(inputString.charAt(i + 1)) { case '0': /* Null */ outputString += 0x00; break; case 'E': /* End of Transmission */ outputString += 0x04; break; case 'a': /* Bell */ outputString += 0x07; break; case 'b': /* Backspace */ outputString += 0x08; break; case 't': /* Horizontal tab */ outputString += 0x09; break; case 'n': /* Line feed */ outputString += 0x0a; break; case 'v': /* Vertical tab */ outputString += 0x0b; break; case 'f': /* Form feed */ outputString += 0x0c; break; case 'r': /* Carriage return */ outputString += 0x0d; break; case 'e': /* Escape */ outputString += 0x1b; break; case 'G': /* Group Separator */ outputString +=0x1d; break; case 'R': /* Record Separator */ outputString += 0x1e; break; default: outputString += '\\'; outputString += inputString.charAt(i); break; } i += 2; } else { outputString += '\\'; i++; } } else { outputString += inputString.charAt(i); i++; } } while(i < inputString.length()); return outputString; } }