Generating a Code39 Barcode: Difference between revisions

From Scribus Wiki
Jump to navigation Jump to search
No edit summary
Line 3: Line 3:
The script creates that custom part, which has a 10-digit number, then underneath is the barcode. By trial and error I determined that this was a Code39 barcode. Unfortunately, the barcode generator in Scribus cannot be scripted, and in fact you cannot make a custom size for the barcode, so I was copying the 10-digit number, then running Barcode generator, then resizing the created code, which is a PostScript creation, so when it's resized, the width of the bars may change. So far it's been Ok, but this might affect the scanning process.
The script creates that custom part, which has a 10-digit number, then underneath is the barcode. By trial and error I determined that this was a Code39 barcode. Unfortunately, the barcode generator in Scribus cannot be scripted, and in fact you cannot make a custom size for the barcode, so I was copying the 10-digit number, then running Barcode generator, then resizing the created code, which is a PostScript creation, so when it's resized, the width of the bars may change. So far it's been Ok, but this might affect the scanning process.


So here is a first attempt, '''code39.py'''. It is not very fast. Creating a 10-digit barcode takes 60-70 seconds. I suspect that either the parsing of the code for narrow and wide lines or the repetitive line drawing (or both) is the speed issue. So far this will only generate a code for digits (plus the start/stop characters). I'd like to see if I can speed it up before adding letter capability.
So here is a first attempt, '''code39.py'''. It is not very fast – or so I thought – today I tried it on my netbook and it only took about 15 seconds. Creating a 10-digit barcode takes 60-70 seconds. I suspect that either the parsing of the code for narrow and wide lines or the repetitive line drawing (or both) is the speed issue. So far this will only generate a code for digits (plus the start/stop characters). I'd like to see if I can speed it up before adding letter capability.


====code39.py====
====code39.py====

Revision as of 12:47, 1 August 2010

The reason for writing this script was that I had already written a script for modifying a form we use, and on this form are barcodes, one of which indicates the type of form, but the other is variable according to the content of the page.

The script creates that custom part, which has a 10-digit number, then underneath is the barcode. By trial and error I determined that this was a Code39 barcode. Unfortunately, the barcode generator in Scribus cannot be scripted, and in fact you cannot make a custom size for the barcode, so I was copying the 10-digit number, then running Barcode generator, then resizing the created code, which is a PostScript creation, so when it's resized, the width of the bars may change. So far it's been Ok, but this might affect the scanning process.

So here is a first attempt, code39.py. It is not very fast – or so I thought – today I tried it on my netbook and it only took about 15 seconds. Creating a 10-digit barcode takes 60-70 seconds. I suspect that either the parsing of the code for narrow and wide lines or the repetitive line drawing (or both) is the speed issue. So far this will only generate a code for digits (plus the start/stop characters). I'd like to see if I can speed it up before adding letter capability.

code39.py

#!/usr/bin/env python

# File: code39.py
# Based on postnet2.py originally 2006.03.06  Gregory Pittman
# this version 2010.07.31
# So far will only encode numbers, plus the start/stop character

"""
Simple operation, but not very fast.
First dialog asks for your code (numbers only so far), as many digits
as you want.
Second dialog asks for height of bars in points. Barcode is arbitrarily 
created at XPos of 200, YPos 100.

"""

import scribus

code39 = ['nnswwn','wnsnnw','nwsnnw','wwsnnn','nnswnw','wnswnn','nwswnn','nnsnww','wnsnwn','nwsnwn']
# I'm using 'n' to denote a narrow line, 'w' for wide line, 's' for wide space
# if a space is not wide then a narrow space is created

startstop = 'nsnwwn'
narrow = 0.8   # narrow line width
wide = 2.4    # wide line width
b="Black"     #line color
relx=200      #Start X
rely=100      #Start Y

if scribus.haveDoc():
    S = scribus.valueDialog('Code 39','Enter Number')
    height = scribus.valueDialog('Code 39','Enter Height of Bars (Points)')
    height = int(height)
    scribus.setRedraw(1)
    scribus.setUnit(0)

    code = startstop  # what I'm doing here is creating one big string of the bar-space sequence

    for x in S[0:]:
        if x.isdigit():
            xnum = int(x)
            code = code + code39[xnum]

    code = code + startstop

    for y in code[0:]:         # now we parse that one big string and make lines
        if y == 'n':
            relx = relx + narrow/2
            d = scribus.createLine(relx,rely,relx,rely + height,) #narrow line
            scribus.setLineWidth(narrow, d)
            scribus.setLineColor(b, d)
            scribus.setFillColor(b, d)
            relx = relx + narrow + narrow/2
        elif y == 'w':
            relx = relx + wide/2
            d = scribus.createLine(relx,rely,relx,rely + height,) #wide line
            scribus.setLineWidth(wide, d)
            scribus.setLineColor(b, d)
            scribus.setFillColor(b, d)
            relx = relx + narrow + wide/2
        elif y == 's':                                      #for wide space
            relx = relx + wide

    scribus.redrawAll()

Line Positions

Something worth mentioning here is that the precise position of the endpoints of lines is in the middle of the line. Thus, when I was creating lines of a particular width with very specific spacing in between, I had to account for the width of the lines or otherwise they would encroach on the space, and so you see these weird arithmetic additions in the if/elif loops.

About Code39

Code 39 is a widely used code consisting of a series of narrow and wide black lines, alternating with narrow or wide white spaces. Each character is denoted by a sequence of 5 lines and 4 intervening spaces, with a narrow space in between characters. The digits 0-9 and capital letters A-Z, plus *, hyphen, period, $, /, % and space are defined. The * character is also known as the start/stop character, since all codes should begin and end with it to orient the scanner.

Narrow and wide lines, and narrow and wide spaces have corresponding width values, and the relative ratios are generally 1:2.2 to 1:3 (narrow:wide).