using FastReport.Utils;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace FastReport.Barcode
{
///
/// Generates the PostNet barcode.
///
public class BarcodePostNet : LinearBarcodeBase
{
private static string[] tabelle_PostNet = {
"5151919191", //0
"9191915151", //1
"9191519151", //2
"9191515191", //3
"9151919151", //4
"9151915191", //5
"9151519191", //6
"5191919151", //7
"5191915191", //8
"5191519191" //9
};
internal override string GetPattern()
{
string result = "51";
for (int i = 0; i < text.Length; i++)
result += tabelle_PostNet[CharToInt(text[i])];
result += "5";
return result;
}
}
///
/// Generates the Japan Post 4 State Code barcode.
///
public class BarcodeJapanPost4StateCode : LinearBarcodeBase
{
private string CeckDigitSet = "0123456789-abcdefgh";
private string EncodeTable = "1234567890-abcdefgh";
private static string[] JapanTable =
{
"6161E", //1
"61G1F", //2
"G161F", //3
"61F1G", //4
"61E16", //5
"G1F16", //6
"F161G", //7
"F1G16", //8
"E1616", //9
"61E1E", //0
"E161E", //-
"G1F1E", //a
"G1E1F", //b
"F1G1E", //c
"E1G1F", //d
"F1E1G", //e
"E1F1G", //f
"E1E16", //g
"61616" //h
};
internal override string GetPattern()
{
string encoded = "";
int sum = 0;
int weight = 0;
string result = "61G1"; // start bar
if (text.Length < 7)
{
throw new FormatException(Res.Get("Messages,BarcodeFewError"));
}
foreach (var i in text)
{
if (((i >= '0') && (i <= '9')) || (i == '-'))
{
encoded += i;
weight++;
}
else
{
if ((i >= 'A') && (i <= 'J'))
{
encoded += 'a';
encoded += (char)(i - 'A' + '0');
}
if ((i >= 'K') && (i <= 'T'))
{
encoded += 'b';
encoded += (char)(i - 'K' + '0');
}
if ((i >= 'U') && (i <= 'Z'))
{
encoded += 'c';
encoded += (char)(i - 'U' + '0');
}
weight += 2;
}
}
// remove the hyphens that will not be encoded in the barcode
if (encoded.IndexOf('-') == 3)
{
encoded = encoded.Remove(3, 1);
weight--;
}
if (encoded.IndexOf('-', 5) == 7)
{
encoded = encoded.Remove(7, 1);
weight--;
}
if (weight > 20 || Regex.IsMatch(text.Substring(0, 7), "[^0-9\\-]") ||
Regex.IsMatch(text.Substring(7, text.Length - 7), "[^A-Z0-9\\-]") ||
(encoded.IndexOf('-') < 8 && encoded.IndexOf('-') != -1 ))
{
throw new FormatException(Res.Get("Messages,BarcodeLengthMismatch"));
}
// fill pad character CC4, if need
for (int i = encoded.Length; i < 20; i++)
{
encoded += 'd';
}
for (int i = 0; i < 20; i++)
{
result += JapanTable[EncodeTable.IndexOf(encoded[i])];
sum += CeckDigitSet.IndexOf(encoded[i]);
result += '1';
}
//Calculate check digit
char check_char = char.MinValue;
int check = 19 - (sum % 19);
if (check == 19) { check = 0; }
if (check <= 9) { check_char = (char)(check + '0'); }
if (check == 10) { check_char = '-'; }
if (check >= 11) { check_char = (char)((check - 11) + 'a'); }
result += JapanTable[EncodeTable.IndexOf(check_char)];
// data + stop bar
return result + "1G16";
}
}
}