Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Генерируем штрих-код EAN13

Штрих-кот

EAN (European Article Number, европейский номер товара) — европейский стандарт штрих-кода, предназначенный для кодирования идентификатора товара и производителя. Является надмножеством американского стандарта UPC. Формат кода EAN13 позволяет закодировать строку длиной 12 символов, 13-й является контрольным числом, рассчитываемым на основе первых 12 по определенной формуле.

Имеются разные платные и бесплатные библиотеки для генерации EAN-13 в Java. Вячеслав Арчибасов написал свой класс, который реализован на Java, работает в J2ME и Android.

Создадим новый проект и добавим в него новый класс EAN13CodeBuilder, предназначенный для кодирования последовательности 12 чисел в строку текста в EAN-13, которую затем можно отобразить на экране с помощью специального шрифта. Используется класс очень просто - в конструктор передается исходная строка, затем метод getCode() возвращает строку в EAN-13. Исходный код класса выглядит так:


package ru.alexanderklimov.ean13generator;

public class EAN13CodeBuilder {
	private String codeStringValue;
	private String generatedCode;

	public EAN13CodeBuilder(String codeString) {
		codeStringValue = codeString;
		parse();
	}

	public String getCode() {
		return generatedCode;

	}

	private String getFullCode() {

		int chetVal = 0, nechetVal = 0;
		String codeToParse = codeStringValue;

		for (int index = 0; index < 6; index++) {
			chetVal += Integer.valueOf(
					codeToParse.substring(index * 2 + 1, index * 2 + 2))
					.intValue();
			nechetVal += Integer.valueOf(
					codeToParse.substring(index * 2, index * 2 + 1)).intValue();
		}

		chetVal *= 3;
		int controlNumber = 10 - (chetVal + nechetVal) % 10;
		if (controlNumber == 10)
			controlNumber = 0;

		codeToParse += String.valueOf(controlNumber);

		return codeToParse;

	}

	private String DigitToUpperCase(String digit) {
		String letters = "ABCDEFGHIJ";
		int position = Integer.valueOf(digit).intValue();

		String retVal = letters.substring(position, position + 1);

		return retVal;

	}

	private String DigitToLowerCase(String digit) {
		String letters = "abcdefghij";
		int position = Integer.valueOf(digit).intValue();

		String retVal = letters.substring(position, position + 1);

		return retVal;

	}

	private String createEAN13Code(String rawCode) {
		int firstFlag = Integer.valueOf(

		rawCode.substring(0, 1)

		).intValue();

		String leftString = rawCode.substring(1, 7);
		String rightString = rawCode.substring(7);

		String rightCode = "";
		String leftCode = "";

		for (int i = 0; i < 6; i++) {
			rightCode += DigitToLowerCase(rightString.substring(i, i + 1));
		}

		if (firstFlag == 0) {
			leftCode = "#!" + leftString.substring(0, 1)
					+ leftString.substring(1, 2) + leftString.substring(2, 3)
					+ leftString.substring(3, 4) + leftString.substring(4, 5)
					+ leftString.substring(5);
		}
		if (firstFlag == 1) {
			// /System.out.println("leftString: "+leftString);
			leftCode = "$!" + leftString.substring(0, 1)
					+ leftString.substring(1, 2)
					+ DigitToUpperCase(leftString.substring(2, 3))
					+ leftString.substring(3, 4)
					+ DigitToUpperCase(leftString.substring(4, 5))
					+ DigitToUpperCase(leftString.substring(5));
		}
		if (firstFlag == 2) {
			leftCode = "%!" + leftString.substring(0, 1)
					+ leftString.substring(1, 2)
					+ DigitToUpperCase(leftString.substring(2, 3))
					+ DigitToUpperCase(leftString.substring(3, 4))
					+ leftString.substring(4, 5)
					+ DigitToUpperCase(leftString.substring(5));
		}
		if (firstFlag == 3) {
			leftCode = "&!" + leftString.substring(0, 1)
					+ leftString.substring(1, 2)
					+ DigitToUpperCase(leftString.substring(2, 3))
					+ DigitToUpperCase(leftString.substring(3, 4))
					+ DigitToUpperCase(leftString.substring(4, 5))
					+ leftString.substring(5);
		}
		if (firstFlag == 4) {
			leftCode = "'!" + leftString.substring(0, 1)
					+ DigitToUpperCase(leftString.substring(1, 2))
					+ leftString.substring(2, 3) + leftString.substring(3, 4)
					+ DigitToUpperCase(leftString.substring(4, 5))
					+ DigitToUpperCase(leftString.substring(5));
		}
		if (firstFlag == 5) {
			leftCode = "(!" + leftString.substring(0, 1)
					+ DigitToUpperCase(leftString.substring(1, 2))
					+ DigitToUpperCase(leftString.substring(2, 3))
					+ leftString.substring(3, 4) + leftString.substring(4, 5)
					+ DigitToUpperCase(leftString.substring(5));
		}
		if (firstFlag == 6) {
			leftCode = ")!" + leftString.substring(0, 1)
					+ DigitToUpperCase(leftString.substring(1, 2))
					+ DigitToUpperCase(leftString.substring(2, 3))
					+ DigitToUpperCase(leftString.substring(3, 4))
					+ leftString.substring(4, 5) + leftString.substring(5);
		}
		if (firstFlag == 7) {
			leftCode = "*!" + leftString.substring(0, 1)
					+ DigitToUpperCase(leftString.substring(1, 2))
					+ leftString.substring(2, 3)
					+ DigitToUpperCase(leftString.substring(3, 4))
					+ leftString.substring(4, 5)
					+ DigitToUpperCase(leftString.substring(5));
		}
		if (firstFlag == 8) {
			leftCode = "+!" + leftString.substring(0, 1)
					+ DigitToUpperCase(leftString.substring(1, 2))
					+ leftString.substring(2, 3)
					+ DigitToUpperCase(leftString.substring(3, 4))
					+ DigitToUpperCase(leftString.substring(4, 5))
					+ leftString.substring(5);
		}
		if (firstFlag == 9) {
			leftCode = ",!" + leftString.substring(0, 1)
					+ DigitToUpperCase(leftString.substring(1, 2))
					+ DigitToUpperCase(leftString.substring(2, 3))
					+ leftString.substring(3, 4)
					+ DigitToUpperCase(leftString.substring(4, 5))
					+ leftString.substring(5);
		}

		String retVal = leftCode + "-" + rightCode + "!";

		return retVal;
	}

	private void parse() {
		String fullString = getFullCode();
		System.out.println("Full code: " + fullString);

		generatedCode = createEAN13Code(fullString);

		System.out.println("Generated code: " + generatedCode);

	}
}

Осталось поместить в папку assets/fonts нужный шрифт, разместить на форме текстовую метку для отображения кода и кнопку для ее генерации. Размер шрифта для TextView желательно выбрать побольше (android:textSize="100dp"):


public void onButtonClick(View v){
	TextView tvBarcode = (TextView)findViewById(R.id.tvBarcode);
	/// установить шрифт штрих-кода
	Typeface font = Typeface.createFromAsset(this.getAssets(), "fonts/EanP72Tt Normal.Ttf");
	tvBarcode.setTypeface(font);

	EAN13CodeBuilder bb = new EAN13CodeBuilder("124958761310");
	tvBarcode.setText(bb.getCode());
}

EAN13

Дополнительные материалы

Считываем штрих-код

Реклама