Штрих-код PDF417

Обсуждение Stimulsoft Reports.NET
Ответить
Сергей
Сообщения: 70
Зарегистрирован: 13 окт 2008, 03:56
Откуда: Пермь
Контактная информация:

Штрих-код PDF417

Сообщение Сергей »

Доброго времени суток.

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

Спасибо.
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Штрих-код PDF417

Сообщение Ivan »

Здравствуйте.

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

Спасибо.
Сергей
Сообщения: 70
Зарегистрирован: 13 окт 2008, 03:56
Откуда: Пермь
Контактная информация:

Штрих-код PDF417

Сообщение Сергей »

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

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

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

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

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

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

Спасибо.
Сергей
Сообщения: 70
Зарегистрирован: 13 окт 2008, 03:56
Откуда: Пермь
Контактная информация:

Штрих-код PDF417

Сообщение Сергей »

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

Как все-таки кодировать символы с кодом больше 127?
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Штрих-код PDF417

Сообщение 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-битную кодовую страницу, затем как с массивом байтов.

Спасибо.
Вложения
Test_PDF417.zip
(3.8 КБ) 411 скачиваний
Сергей
Сообщения: 70
Зарегистрирован: 13 окт 2008, 03:56
Откуда: Пермь
Контактная информация:

Штрих-код PDF417

Сообщение Сергей »

Спасибо! :feelgood:
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Штрих-код PDF417

Сообщение Ivan »

Здравствуйте.

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

Спасибо.
Ответить