[reportlab-users] Code 39 Check digit bug ?

Robin Becker robin at reportlab.com
Fri Jul 3 08:43:52 EDT 2009

Ian Cottee wrote:

> Using reportlab2.2, with python2.5 on Mac OSX


> from reportlab.graphics.barcode import code39

> In [2]: bc1 = code39.Extended39('48281450412')


> In [4]: bc1.validate()

> Out[4]: '48281450412'


> In [5]: bc1.encode()

> Out[5]: '*48281450412**'


> That check digit of '*' appears to be wrong. Our clients can't scan

> the code and the docs would appear to say that it should be a '$'.


> Using the code from Wikipedia at


> http://en.wikipedia.org/wiki/Code_39


I looked at the code39 _patterns and it seems that we have an extra character ie
* in between ' ' and '$'. That character is also in the _valchars array there
and in the definition of _std_chars. The _patterns are used to calculate the
value of the

Checking in the original contribution and that is there. So presumably there was
some mistake in the original coding.

I believe that * is allowed to be transmitted as the start and stop characters
(cf http://www.barcodeman.com/info/c39_1.php3) so it has a valid pattern, but
obviously there's a bug since we should not include it in the valid character set.

I have tried a small patch which is in the attached file. I've checked and we
now get the right value from _encode39 ie

>>>> code39._encode39('48281450412',1,1)

> '*48281450412$*'

can interested people try this out?

> def append_c39_checksum(st):

> charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"

> return st + charset[ sum(charset.index(c) for c in st) % 43 ]


> In [8]: append_c39_checksum('48281450412')

> Out[8]: '48281450412$'


> Is this a known issue or a misunderstanding on my part? It only

> appears to happen when the checkdigit sum is 39. We have the same

> result on the clients system which is running Ubuntu 8.04


> Many thanks


> Ian Cottee

> Blue Fountain Systems Ltd


Robin Becker
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: code39.py
Url: <http://two.pairlist.net/pipermail/reportlab-users/attachments/20090703/957b0dc1/attachment.ksh>

More information about the reportlab-users mailing list