Страница 1 из 1

Штрих-код PDF417

Добавлено: 12 май 2009, 12:00
Сергей
Доброго времени суток.

Необходимо кодировать в PDF417 текст в кодировке windows-1251.
В дизайнере невозможно указать в качестве текста (поле "код" компонента штрих-код) что-либо кроме латинского текста в режимах Text и Byte. То есть, даже в режиме Byte кириллица является недопустимой.
Как можно решить данную задачу?

Спасибо.

Штрих-код PDF417

Добавлено: 12 май 2009, 15:02
Ivan
Здравствуйте.

Прямо в дизайнере можно ввести только латинский текст и цифры (символы с кодами 32-127).
Все символы ASCII можно ввести:
- из кода;
- из базы данных, заранее подготовив все данные в нужной кодировке;
- в дизайнере, если создать свою функцию для перекодирования, например: ToCodePage1251("Русский текст")

Спасибо.

Штрих-код PDF417

Добавлено: 13 май 2009, 04:09
Сергей
Здравствуйте.
например: ToCodePage1251("Русский текст")
Что должна возвращать такая функция?
В .NET все строки представляются в unicode. Поэтому, видимо, должен возвращаться набор байт. При написании в поле "код", например, такого выражения

Код: Выделить всё

{System.Text.Encoding.Unicode.GetBytes(AbonentInfo.Account)}
В штрих-код кодируется не соответствующий набор байт, а что-то одинаковое для всех строк и не зависящее от данных.
Хотя код

Код: Выделить всё

{AbonentInfo.Account}
вполне нормально кодирует данные из источника (но не будет кодировать, если в этом поле источника текст содержит кириллицу).

Еще при дизайне на штрих-коде отображается одно (или ошибка), а в предпросмотре - другое.

Спасибо.

Штрих-код PDF417

Добавлено: 13 май 2009, 06:01
Сергей
Кстати, что подразумевалось под
Все символы ASCII
?
Класс System.Text.Encoding.ASCII работает лишь с 7 битами. В то время как в режиме Byte должны быть доступны 8 бит (так называемый extended ASCII, одним из которых cp1251 и является).

Как все-таки кодировать символы с кодом больше 127?

Штрих-код PDF417

Добавлено: 13 май 2009, 07:16
Ivan
Здравствуйте.
ToCodePage1251("Русский текст"). Что должна возвращать такая функция?
Пример функции для преобразования данных в нужную кодовую страницу:

Код: Выделить всё

		public string ToCodepage1251(string st)
		{
			byte[] bt = System.Text.Encoding.GetEncoding(1251).GetBytes(st);
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			for (int index = 0; index < bt.Length; index++)
			{
				sb.Append((char)bt[index]);
			}
			return sb.ToString();
		}
Пример отчета с использованием данной функции смотрите в аттаче.
При написании в поле "код", например, такого выражения

Код: Выделить всё

{System.Text.Encoding.Unicode.GetBytes(AbonentInfo.Account)}
В штрих-код кодируется не соответствующий набор байт, а что-то одинаковое для всех строк и не зависящее от данных.
Правильно, прямое преобразование byte[] в string дает строку "System.Byte[]".
Поэтому и требуется вышеописанная функция.
Еще при дизайне на штрих-коде отображается одно (или ошибка), а в предпросмотре - другое.
Если на вход штрихкода подается выражение, то во время дизайна на штрихкоде отображается именно это выражение как строка текста, без вычисления. Вычисление выражения производится на этапе рендеринга отчета, и в превью штрихкод будет отображать уже значение выражения, т.е. требуемые данные
Кстати, что подразумевалось под "Все символы ASCII"?
Класс System.Text.Encoding.ASCII работает лишь с 7 битами. В то время как в режиме Byte должны быть доступны 8 бит (так называемый extended ASCII, одним из которых cp1251 и является).
Как все-таки кодировать символы с кодом больше 127?
Прямая работа с 8-битными кодировками в .Net не всегда удобна. Поэтому мы использовали следующий метод для передачи данных в штрихкод:
На вход штрихкода принимается string, уникодный, который может содержать любые подготовленные данные.
Внутри штрихкода стринг преобразуется в массив байтов, каждый символ преобразуется командой (byte)st[index].

Соответственно при записи данных в штрихкод в зависимости от типа входных данных получаются следующие варианты:
- латиница: передавать стринг как есть.
- байты: преобразовать в стринг, каждый байт преобразовать командой (char)byteArray[index].
- национальные символы: преобразовать в нужную 8-битную кодовую страницу, затем как с массивом байтов.

Спасибо.

Штрих-код PDF417

Добавлено: 13 май 2009, 08:05
Сергей
Спасибо! :feelgood:

Штрих-код PDF417

Добавлено: 13 май 2009, 08:30
Ivan
Здравствуйте.

Дайте нам знать, если вам понадобится ещё какая-нибудь помощь.

Спасибо.