/* * Copyright 2014 Robin Stuart * * 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.backend; import java.awt.geom.Rectangle2D; import java.util.Locale; /** * Implements the Japanese Postal Code symbology as used to encode adress * data for mail items in Japan. Valid input characters are digits 0-9, * characters A-Z and the dash (-) character. A modulo-19 check digit is * added and should not be included in the input data. * @author <a href="mailto:rstuart114@gmail.com">Robin Stuart</a> */ public class JapanPost extends Symbol { private String[] JapanTable = { "FFT", "FDA", "DFA", "FAD", "FTF", "DAF", "AFD", "ADF", "TFF", "FTT", "TFT", "DAT", "DTA", "ADT", "TDA", "ATD", "TAD", "TTF", "FFF" }; private char[] kasutSet = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' }; private char[] chKasutSet = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' }; @Override public boolean encode() { String dest; String inter; int i, sum, check; char c; content = content.toUpperCase(Locale.ENGLISH); if(!(content.matches("[0-9A-Z]+"))) { error_msg = "Invalid characters in data"; return false; } inter = ""; for (i = 0; (i < content.length()) && (inter.length() < 20); i++) { c = content.charAt(i); if ((c >= '0') && (c <= '9')) { inter += c; } if (c == '-') { inter += c; } if ((c >= 'A') && (c <= 'J')) { inter += 'a'; inter += chKasutSet[(c - 'A')]; } if ((c >= 'K') && (c <= 'O')) { inter += 'b'; inter += chKasutSet[(c - 'K')]; } if ((c >= 'U') && (c <= 'Z')) { inter += 'c'; inter += chKasutSet[(c - 'U')]; } } for (i = inter.length(); i < 20; i++) { inter += "d"; } dest = "FD"; sum = 0; for (i = 0; i < 20; i++) { dest += JapanTable[positionOf(inter.charAt(i), kasutSet)]; sum += positionOf(inter.charAt(i), chKasutSet); } /* Calculate check digit */ check = 19 - (sum % 19); dest += JapanTable[positionOf(chKasutSet[check], kasutSet)]; dest += "DF"; encodeInfo += "Encoding: " + dest + "\n"; encodeInfo += "Check Digit: " + check + "\n"; readable = ""; pattern = new String[1]; pattern[0] = dest; row_count = 1; row_height = new int[1]; row_height[0] = -1; plotSymbol(); return true; } @Override protected void plotSymbol() { int xBlock; int x, y, w, h; rectangles.clear(); x = 0; w = 1; y = 0; h = 0; for (xBlock = 0; xBlock < pattern[0].length(); xBlock++) { switch (pattern[0].charAt(xBlock)) { case 'A': y = 0; h = 5; break; case 'D': y = 3; h = 5; break; case 'F': y = 0; h = 8; break; case 'T': y = 3; h = 2; break; } Rectangle2D.Double rect = new Rectangle2D.Double(x, y, w, h); rectangles.add(rect); x += 2; } symbol_width = pattern[0].length() * 3; symbol_height = 8; } }