Reputation: 63
Okay i created a script today that takes an item# or any number for that purpose to generate a barcode. Now i wanted to print 60 same barcodes in 4 columns, that would make it a matrix of (15 X 4) only making it easy to understand. Now i successfully achieved it with a custom sized page (900*850) and fitted in 15 rows and 4 columns of barcodes generated by reportlab code128.
Here is the code:
from reportlab.graphics.barcode import code128
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
#----------------------------------------------------------------------#
def createBarCodes():
codeName = "NOT_C17"
c = canvas.Canvas(codeName+".pdf")
c.setPageSize((900, 850))
barcode_value = codeName
barcode128 = code128.Code128(
barcode_value,
barHeight=20,
barWidth=1.05,
fontSize=15,
humanReadable = True
)
x = 15 * mm
for i in range(4):
y = 275 * mm
i=0
while i < 15:
barcode128.drawOn(c, x, y)
y = y - 18 * mm
i+=1
x=x+(70*mm)
c.save()
if __name__ == "__main__":
createBarCodes()
A file generated by this script
The issue is that now I am restricted to using only US Letter size and no other custom size. I tried few variations but none worked.
Tries:
from reportlab.lib.pagesizes import letter
c = canvas.Canvas(codeName+".pdf", pagesize=letter)
barcode_value = codeName
barcode128 = code128.Code128(
barcode_value,
barHeight=16.7564*mm,
barWidth=44.45*mm,
fontSize=15,
humanReadable = True
)
x = 7.526 * mm
for i in range(4):
y = 265.524 * mm
i=0
while i < 15:
barcode128.drawOn(c, x, y)
y = y - 18 * mm
i+=1
break
x=x+(70*mm)
break
c.save()
and here is the required format that it must fit in. Would be nice to have to help.
Upvotes: 0
Views: 1167
Reputation:
You code requires a lot of improvement
from reportlab.lib.pagesizes import letter
Set your margins and other variables as specified in the document :
margin_x = 7.526
margin_y = 13.876
padding_x = 7.526
font_size = 15
width, height = letter
Calculate the total size of the generated codebar
bars_width = (float(width-margin_x*2)-3*padding_x)/4
bars_height = float(height-margin_y*2)/15
The width value passed to the function Code128 is the width of a single bar within the codebar and not the whole codebar, you should keep this value below 1.1
bar_height = bars_height - font_size
bar_width = 1
your loops would be better this way :
for i in range(0,4):
for j in range(0,15):
x = margin_x + i * (bars_width+padding_x)
y = margin_y + j * bars_height
barcode128.drawOn(c, x , y)
this is the final script :
from reportlab.graphics.barcode import code128
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
#----------------------------------------------------------------------#
def createBarCodes():
codeName = "NOT_C17"
c = canvas.Canvas(codeName+".pdf",pagesize=letter)
margin_x = 7.526
margin_y = 13.876
padding_x = 7.526
font_size = 15
width, height = letter
extra_padding = 20
bars_width = (float(width-margin_x*2)-3*padding_x)/4
bars_height = float(height-margin_y*2)/15
bar_height = bars_height - font_size
#For alphanumeric values, the total number of bars is calculated as:
#total = (11*string_length+35)
bar_width = (bars_width-extra_padding)/(len(codeName)*11+35)
barcode_value = codeName
barcode128 = code128.Code128(
barcode_value,
barHeight=bar_height,
barWidth=bar_width,
humanReadable = True
)
for i in range(0,4):
for j in range(0,15):
x = margin_x + i * (bars_width+padding_x)
y = margin_y + j * bars_height
barcode128.drawOn(c, x , y)
c.save()
if __name__ == "__main__":
createBarCodes()
Upvotes: 2