С#: Генерация штрих-кода Code 128 (ширина штрихов/пробелов)

Итак, я унаследовал этот код, или, лучше сказать, кто-то разработал его и пошел дальше, и теперь у нас с ним проблема, и я его изучаю...

Мы генерируем штрих-коды c128, и после их сертификации они заметили проблему, которую я не могу понять. Ширина штрихов/промежутков составляет 10,5 мил, а допустимый диапазон составляет 15–21 мил (1 мил = 0,001 дюйма).

Код рендеринга основан на этой библиотеке: http://www.codeproject.com/KB/GDI-plus/GenCode128.aspx, но несколько изменен...

Все генерируемые штрих-коды являются буквенно-цифровыми, без специальных символов. Я думал, что ширина полосы + пробел зависит от кодируемого символа.

Вот используемые настройки:

settings.Font = new Font ( FontFamily.GenericSansSerif, 12 );
settings.TopMargin = 10
settings.BottomMargin = 10
settings.LeftMargin = 10
settings.RightMargin = 10
settings.BarCodeHeight = 80
settings.DrawText = true
settings.BarCodeToTextGapHeight = 10
settings.InterCharacterGap = 2

Если бы я угадал, я думаю, это потому, что ширина полос основана на высоте штрих-кода, а не высота штрих-кода на основе длины текста и штрих-кода. Но я не слишком знаком со спецификацией (даже после ее просмотра), и я в лучшем случае начинающий программист на С#...


person Brad    schedule 11.08.2011    source источник
comment
Вы можете найти GenCode128.dll в NuGet: nuget.org/packages/GenCode128 Также источник может быть найдено на GitHub: github.com/SourceCodeBackup/GenCode128   -  person Nikolay Kostov    schedule 21.11.2015


Ответы (3)


Это не прямой ответ, НО я настоятельно рекомендую использовать хорошо протестированную библиотеку для генерации штрих-кодов... получить правильные штрих-коды непросто, так как есть некоторые подводные камни... существует множество библиотек, некоторые коммерческие, немного бесплатно...

2 бесплатные библиотеки штрих-кодов для .NET:
http://barcoderender.codeplex.com/
http://www.codeproject.com/KB/graphics/BarcodeLibrary.aspx

person Yahia    schedule 11.08.2011
comment
Я полностью с вами согласен, просто переключиться на одну из них может быть не так просто, как переключить DLL... - person Brad; 11.08.2011
comment
вы даже можете использовать такую ​​библиотеку для реализации метода MakeBarcodeImage - таким образом, интерфейс не меняется, и никакие другие части вашего проекта не нужно менять... - person Yahia; 11.08.2011
comment
в предоставленной вами ссылке прямо указано, что они не всегда соответствуют спецификации, поскольку они не обеспечивают минимальную ширину, похоже, именно ваша проблема... - person Yahia; 11.08.2011
comment
Вы правы... Попробую перейти на новую библиотеку... Спасибо! - person Brad; 11.08.2011

FWIW, это чрезвычайно плохая процедура генерации штрих-кодов, и вам следует отказаться от нее и искать библиотеку, которая была специально написана для генерации этих штрих-кодов.

Какое разрешение контекста устройства используется для создания растрового изображения?

Судя по всему, ваш код по умолчанию использует контекст экранного устройства, что составляет 96 точек на дюйм.

Штрих-коды должны создаваться с разрешением не менее 300 dpi, предпочтительно 600 dpi и в идеале 2540 dpi.

При разрешении 96 dpi вы никогда не достигнете разрешения, необходимого для данной точности.

Решение 1. Измените код, чтобы использовать контекст устройства принтера с высоким разрешением, и создайте растровое изображение с этим разрешением. В настоящее время ваш код просто использует произвольно вычисленную ширину.

Следующая проблема заключается в том, что в коде используется целочисленная ширина полосы и выполняется приведение к типу с плавающей запятой (ура!). Это становится проблемой при работе с низким dpi (даже с высоким dpi, но не настолько), поскольку некоторые полосы/пробелы могут занимать 2 пикселя, а некоторые могут занимать 3, поэтому в итоге вы получите штрих-код с неровными полосами/пробелами.

Решение 2. Убедитесь, что все полосы/пробелы, которые должны иметь одинаковую ширину, имеют одинаковую ширину.

ХТН

person TheBarcodeMan    schedule 11.08.2011
comment
Я должен согласиться, это плохая рутина. Штрих-коды являются двоичными, следует использовать постоянную ширину строки с двоичными кодами из: en.wikipedia.org/wiki /Код_128 - person Martin; 11.08.2011
comment
Спасибо за совет... Вероятно, мне следует посмотреть бесплатную библиотеку и потратить время на то, чтобы она заработала... - person Brad; 11.08.2011

Если вы не хотите использовать бесплатную библиотеку штрих-кодов, как предложил Yahia, я думаю, что увеличение значения: settings.InterCharacterGap должно помочь.

Тем не менее, я думаю, вам следует взглянуть на эти библиотеки. Таким образом, у вас будет меньше кода для поддержки, вы сможете легче адаптировать свое программное обеспечение, а если тип штрих-кодов потребует изменений, вы сможете поддерживать его сразу, вместо того, чтобы заново изобретать колесо.

person Martin    schedule 11.08.2011