def get_pdf(self, spec, objects, print_options=False): """Return PDF data for labels of objects. spec: A labels.Specification object describing the sheets objects: A recordset of objects to report on border: Whether to print borders on the sheets print_options: Dictionary containing key number_of_copies """ self.ensure_one() print_options = print_options or {} renderer = self.get_renderer_plugin() config = renderer.get_template_config(self) def renderer_closure(label, width, height, obj): return renderer.render_label(label, width, height, obj, config) sheet = labels.Sheet(spec, renderer_closure, border=print_options.get('border', False)) renderer.populate_sheet(sheet, objects, config, print_options=print_options) pdfbuf = StringIO() sheet.save(pdfbuf) pdf = pdfbuf.getvalue() return pdf
def verdmidar(vorur): """ Býr til PDF skjal af verðmiðum úr lista af Vörum. """ import labels from reportlab.graphics import shapes from reportlab.pdfbase.pdfmetrics import stringWidth # Create an A4 portrait (210mm x 297mm) sheets with 2 columns and 8 rows of # labels. Each label is 90mm x 25mm with a 2mm rounded corner. The margins are # automatically calculated. specs = labels.Specification(210, 297, 2, 8, 90, 25, corner_radius=2) # Create a function to draw each label. This will be given the ReportLab drawing # object to draw on, the dimensions (NB. these will be in points, the unit # ReportLab uses) of the label, and the object to render. def draw_label(label, width, height, vara): textastaerd = 32 nafnbreidd = stringWidth(vara.fulltnafn, "Helvetica", textastaerd) while nafnbreidd > width - 4: textastaerd *= 0.95 nafnbreidd = stringWidth(vara.fulltnafn, "Helvetica", textastaerd) nafnbreidd = stringWidth(vara.fulltnafn, "Helvetica", textastaerd) label.add( shapes.String((width - nafnbreidd) / 2, height - 32 - 16, str(vara.fulltnafn), fontName="Helvetica", fontSize=textastaerd)) label.add( shapes.String(2, 2, str(vara.verd().smasoluverd) + ' kr.', fontName="Helvetica", fontSize=16)) label.add( shapes.String(width - 2, 2, str(vara.vorunumer()), fontName="Helvetica", fontSize=16, textAnchor="end")) # Create the sheet. #sheet = labels.Sheet(specs, draw_label, border=False) sheet = labels.Sheet(specs, draw_label) # Add a couple of labels. for vara in vorur: sheet.add_label(vara) print(vara.verd()) #print(vara.verd) # Save the file and we are done. sheet.save('basic.pdf') print("{0:d} label(s) output on {1:d} page(s).".format( sheet.label_count, sheet.page_count))
def create_pdf(db, ids): specs = labels.Specification(57, 32, 1, 2, 57, 16) sheet = labels.Sheet(specs, _draw_label, border=True) for i in ids: item = _query_by(db, Item, 'id', i) project = _query_by(db, Project, 'name', item.project_name) sheet.add_label((item, project)) sheet.save('tmp/label.pdf') return 'label.pdf'
def download_medal_labels(request): specs = labels.Specification(215.9, 279.4, 4, 5, 38.1, 38.1, corner_radius=19.0, top_margin=20, bottom_margin=20) sheet = labels.Sheet(specs, draw_medal_label, border=False) medal_labels = [] for division in models.Division.objects.all(): # Event Awards for event in models.Event.objects.all(): for place in range(division.event_award_count): medal_labels.append({ 'meet': division.meet.short_name, 'session': division.session.first().name, 'level': 'Level: {}'.format(division.level.name.upper()), 'age_div': 'Div: {}'.format(division.short_name), 'place': '{} Place'.format(ordinal(place + 1)), 'event': event.name, }) # All Around Awards, skipping 1st-3rd place if division.all_around_award_count > 3: for place in range(4, division.all_around_award_count + 1): medal_labels.append({ 'meet': division.meet.short_name, 'session': division.session.first().name, 'level': 'Level: {}'.format(division.level.name.upper()), 'age_div': 'Div: {}'.format(division.short_name), 'place': '{} Place'.format(ordinal(place)), 'event': 'All Around', }) sheet.add_labels(medal_labels) timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M') response = HttpResponse(content_type='applicaiton/pdf') response[ 'content-Disposition'] = 'attachment;filename=medal_labels_' + timestamp + '.pdf' sheet.save(response) return response
def saveAuxLabelSheet(self, auxLabels): """ create the aux labels and return a consolidated sheet """ SmallSheet = labelPrinter.Sheet(self.smallSpecs, self.draw_aux_label, border=self.drawBorder) LargeSheet = labelPrinter.Sheet(self.largeSpecs, self.draw_aux_label, border=self.drawBorder) largeLabel = Label.objects.get(description__icontains='5160') smallLabel = Label.objects.get(description__icontains='5167') # make the subdirectory for aux labels auxDir = self.printdirectory + 'auxLabels/' if os.path.isdir(auxDir) == False: os.mkdir(auxDir) for auxLabel in auxLabels: if auxLabel.label == smallLabel: for x in range(auxLabel.quantityToPrint): SmallSheet.add_label(auxLabel.labelText) elif auxLabel.label == largeLabel: for x in range(auxLabel.quantityToPrint): LargeSheet.add_label(auxLabel.labelText) if SmallSheet.page_count > 0: theSheet = auxDir + '100AuxLabelsSmall.pdf' SmallSheet.save(theSheet) if LargeSheet.page_count > 0: theSheet = auxDir + '100AuxLabelsLarge.pdf' LargeSheet.save(theSheet) self.consolidateAllSheets(subDir='auxLabels/') return auxDir
def codes2pdf(codes, batch_id): specs = labels.Specification(210, 297, 3, 10, 65, 25, corner_radius=2, bottom_padding=5) sheet = labels.Sheet(specs, draw_label, border=True) for code in codes: sheet.add_label(code) filename = str(batch_id) + '.pdf' sheet.save(filename) print("{0:d} label(s) output on {1:d} page(s).".format( sheet.label_count, sheet.page_count))
def generate_labels(): mailingInfo = run_scraper() specs = labels.Specification(215.9, 279.4, 3, 10, 66.7, 25.4, corner_radius=2) sheet = labels.Sheet(specs, drawLabel, border=True) sheet.add_labels(mailingInfo) sheet.save('mailing_labels.pdf') print('done!')
def get_sheet(): # Avery 5963 Labels # http://www.avery.com/avery/en_us/Products/Labels/Shipping-Labels/White-Shipping--Labels_05963.htm # http://www.worldlabel.com/Pages/wl-ol125.htm specs = labels.Specification(216, 279, 2, 5, 102, 51, corner_radius=2, left_padding=3, bottom_padding=2, row_gap=0) # Add some fonts. registerFont(TTFont('Judson Bold', os.path.join(base_path, 'Judson-Bold.ttf'))) registerFont(TTFont('KatamotzIkasi', os.path.join(base_path, 'KatamotzIkasi.ttf'))) # Create the sheet. return labels.Sheet(specs, write_name, border=False)
def process_sheet(specs, filename): # Create the sheet. sheet = labels.Sheet(specs, draw_label, border=True) # Add a couple of labels. sheet.add_label("Hello") sheet.add_label("World") # We can also add each item from an iterable. sheet.add_labels(range(3, 22)) # Note that any oversize label is automatically trimmed to prevent it messing up # other labels. sheet.add_label("Oversized label here") # Save the file and we are done. sheet.save(filename) print("{0:s}: {1:d} label(s) output on {2:d} page(s).".format( filename, sheet.label_count, sheet.page_count))
def download_athlete_labels(request): gymnasts = models.Gymnast.objects.all().\ exclude(is_scratched=True, athlete_id=None).\ order_by('division__session', 'team', 'division', 'last_name', 'first_name').\ select_related() specs = labels.Specification(215.9, 279.4, 3, 10, 66.675, 25.4, row_gap=0, corner_radius=2, left_margin=5, right_margin=5) sheet = labels.Sheet(specs, draw_athlete_label, border=False) athlete_labels = [] for gymnast in gymnasts: session = 'None' if gymnast.division and gymnast.division.session.first(): session = gymnast.division.session.first().name label = {} label['id'] = str(gymnast.athlete_id) label['name'] = '{} {}'.format(gymnast.first_name, gymnast.last_name) label['team'] = gymnast.team.team label['info'] = '{2} Level: {0} Div: {1}'.format( gymnast.level.name.upper(), gymnast.division.short_name if gymnast.division else '', session) athlete_labels.append(label) sheet.add_labels(athlete_labels) timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M') response = HttpResponse(content_type='application/pdf') response[ 'Content-Disposition'] = 'attachment;filename=athlete_labels_' + timestamp + '.pdf' sheet.save(response) return response
def create_labels(folder='invitations/scripts/labels/'): def draw_label(label, width, height, obj): label.add( shapes.String(2, 2, str(obj), fontName='Helvetica', fontSize=10)) specs = labels.Specification(215.9, 279.4, 2, 5, 101.6, 50.8, corner_radius=2) guests = Guest.objects.invited().filter(country='US') for page_num, page in enumerate(chunks(guests, size=10)): sheet = labels.Sheet(specs, draw_label, border=True) for guest in page: text = f'{guest.party_line()}\n' text += '\r'.join(guest.address()) sheet.add_label(text) sheet.save(os.path.join(folder, f'label_sheet_{page_num:02}.pdf'))
def create_labels(s): """Create mailing labels (PDF) for each head of house + spouse (if any).""" assert s.logged_in, 'Expected logged in session.' # To debug label placement, setting border=True might help. sheet = labels.Sheet(create_label_spec(), draw_label, border=False) directory = s.get_unit_data()['households'] for record in directory: create_label(sheet, record) file = OUTPUT_DIR / 'mailing_labels.pdf' sheet.save(str(file)) print( f'{sheet.label_count} label(s) ' f'on {sheet.page_count} sheet(s) ' 'saved to', file ) print() print('TIP: Try printing a single page to test proper alignment.')
def download_team_labels(request): sessions = models.Session.objects.all() specs = labels.Specification(215.9, 279.4, 3, 10, 66.675, 25.4, row_gap=0, corner_radius=2, left_margin=5, right_margin=5) sheet = labels.Sheet(specs, draw_team_label, border=False) team_labels = [] for session in sessions: levels = ', '.join(map(str, sorted(session.levels))) teams = Team.objects.filter(gymnasts__division__session=session).\ order_by('gymnasts__division__session', 'team').distinct() for team in teams: team_labels.append({ 'team': team.team, 'session': session.name, 'level': 'Level: {}'.format(levels.upper()) }) sheet.add_labels(team_labels) timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M') response = HttpResponse(content_type='application/pdf') response[ 'Content-Disposition'] = 'attachment;filename=team_labels_' + timestamp + '.pdf' sheet.save(response) return response
def handle_noargs(self, **options): # Get the cages prompt = ('Enter a list of cage names, separated by spaces, for' 'which you need water restriction labels.\n' 'Example: CR22 CR12 CR13\n') data = raw_input(prompt) water_restriction_cage_name_l = data.split() prompt = ('Enter a list of cage names, separated by spaces, for' 'which you need cage labels.\n' 'Example: CR22 CR12 CR13\n') data = raw_input(prompt) cage_card_cage_name_l = data.split() prompt = ('Enter the row to start printing on. Example: for the ' 'second from top row, enter 2: ') data = raw_input(prompt) row_start = int(data) specs = labels.Specification(215.9, 279.4, 2, 15, 87.3, 16.9, corner_radius=2, row_gap=0, column_gap=13.3) def draw_label(label, width, height, obj): print obj try: fillColor = obj['fillColor'] except KeyError: fillColor = 'black' kwargs = { 'fontName': 'Helvetica', 'fontSize': 10, 'textAnchor': 'middle', 'fillColor': fillColor } if obj['typ'] == 'water restriction': kwargs = { 'fontName': 'Helvetica', 'fontSize': 10, 'textAnchor': 'middle', 'fillColor': fillColor } ## Header label.add( shapes.String( width * .5, height - 10, "WATER RESTRICTED -- Cage %s" % obj['cage_name'], **kwargs)) label.add( shapes.String(width * .5, height - 20, "BRUNO LAB AAAY8462 UNI: CCR2137", **kwargs)) label.add( shapes.Line(width * .02, height - 22, width * .98, height - 22, strokeColor=fillColor)) ## Each mouse xy_l = [(.2, -32), (.5, -32), (.8, -32), (.2, -42), (.5, -42), (.8, -42)] for mouse, headplate, xy in zip(obj['mice'], obj['headplates'], xy_l): label.add( shapes.String(width * xy[0], height + xy[1], '%s - %s' % (mouse, headplate), **kwargs)) elif obj['typ'] == 'cage': kwargs = { 'fontName': 'Helvetica', 'fontSize': 10, 'textAnchor': 'start', 'fillColor': fillColor } ## Header label.add( shapes.String(width * .5, height - 10, "Cage: %s" % obj['cage_name'], fontName='Helvetica', fontSize=10, fillColor=fillColor, textAnchor='middle')) ## Each mouse xy_l = [(.1, -20), (.6, -20), (.1, -30), (.6, -30), (.1, -40)] for mouse, full_name, genotype, headplate, xy in zip( obj['mice'], obj['full_names'], obj['genotypes'], obj['headplates'], xy_l): label.add( shapes.String( width * xy[0], height + xy[1], '%s - %s - %s' % (mouse, headplate, full_name), **kwargs)) # Directly specify the cages we need cage_name_l = water_restriction_cage_name_l + cage_card_cage_name_l cage_name_l = list(np.unique(cage_name_l)) # Get the colony specs colony_specs = {} for cage_name in cage_name_l: # Init the specs for this cage colony_specs[cage_name] = {} colony_specs[cage_name]['mice'] = [] colony_specs[cage_name]['headplates'] = [] colony_specs[cage_name]['genotypes'] = [] colony_specs[cage_name]['full_names'] = [] colony_specs[cage_name]['cage_name'] = cage_name # Find the cage cage = runner.models.BehaviorCage.objects.filter( name=cage_name).first() # Set the color colony_specs[cage_name]['fillColor'] = cage.label_color.lower() if colony_specs[cage_name]['fillColor'] == 'pink': colony_specs[cage_name]['fillColor'] = 'magenta' # Iterate over mice for mouse in cage.mouse_set.all(): colony_specs[cage_name]['mice'].append(mouse.name) colony_specs[cage_name]['headplates'].append( mouse.headplate_color) colony_specs[cage_name]['genotypes'].append(mouse.genotype) colony_specs[cage_name]['full_names'].append( mouse.husbandry_name) # Make a sheet sheet = labels.Sheet(specs, draw_label, border=False) # Define the used labels used_labels = [] for row in range( 1, row_start): # second number is the 1-based row to start on for col in range(1, 3): used_labels.append((row, col)) sheet.partial_page(1, used_labels) # Add label for each cage for cage_name, cage_specs in colony_specs.items(): if cage_name in water_restriction_cage_name_l: # Copy specs over cage_specs2 = cage_specs.copy() cage_specs2['typ'] = 'water restriction' # Add the label sheet.add_label(cage_specs2) if cage_name in cage_card_cage_name_l: # Copy specs over cage_specs2 = cage_specs.copy() cage_specs2['typ'] = 'cage' # Add the label sheet.add_label(cage_specs2) sheet.save("auto_created_labels.pdf") os.system('xdg-open auto_created_labels.pdf')
def label_maker(acft): """ Makes labels for my inventory program""" conn = sqlite3.connect('inventory.db') cur = conn.cursor() # nsn, pn, desc, remarks, location, niin, acft db = cur.execute( 'select desc, pn, location, niin, nsn, acft from benchstock where acft="{}" and label="true"' .format(acft)).fetchall() font_path = 'fonts' big_lablels = (101, 34, 2, 7) address_labels = (68.675, 26.4, 3, 10) label_width, label_height, columns, rows = address_labels specs = labels.Specification(215, 279.4, columns, rows, label_width, label_height, row_gap=0, column_gap=4, top_padding=1, bottom_padding=1, right_padding=1) def draw_label_top_bc(label, width, height, obj): # Just convert the object to a string and print this at the bottom left of # the label. label.add( shapes.String(2, 2, str(obj[0]), fontName="Helvetica", fontSize=12)) label.add( shapes.String(2, 13, str(obj[1]), fontName="Helvetica", fontSize=12)) label.add( shapes.String(2, 24, str(obj[2]), fontName="Helvetica", fontSize=12)) label.add(shapes.Image(2, 46, 180, 40, make_barcode(obj[3]))) # label.add(shapes.String(38, 30, str(obj[3]), fontName="3of9", fontSize=30)) label.add( shapes.String(2, 35, str(obj[4]), fontName="Helvetica", fontSize=12)) def make_barcode(code): leading = '000' if acft == 'luh': leading = '720' elif acft == 'apache': leading = '640' code = leading + str(code) ean = barcode.get('ean13', code, writer=ImageWriter()) filename = ean.save('barcodes/{}'.format(code)) return filename sheet = labels.Sheet(specs, draw_label_top_bc, border=False) s = '1234121231234' n = '{}-{}-{}-{}'.format(s[:-9], s[-9:-7], s[-7:-4], s[-4:]) # sheet.add_label([ 'Nomenclature','Part No.', 'Location', '1234121231234',n, '']) for row in db: if row[3] != '': nsn = '{}-{}-{}-{}'.format(row[4][:-9], row[4][-9:-7], row[4][-7:-4], row[4][-4:]) sheet.add_label([row[0], row[1], row[2], row[3], nsn, row[5]]) sheet.save('basic_new.pdf') print("{0:d} label(s) output on {1:d} page(s).".format( sheet.label_count, sheet.page_count))
# Create A4 portrait (210mm x 297mm) sheets with labels. specs = labels.Specification( sheet_width=210, # A4 sheet_height=297, # A4 columns=(config["CONFIG"]["columns"]), rows=(config["CONFIG"]["rows"]), label_width=(config["CONFIG"]["label_width"]), label_height=(config["CONFIG"]["label_height"]), corner_radius=2, ) for countryFile in filesToProcess: # Create the sheet with or without border sheet = labels.Sheet(specs, writeLabelInfo, border=False) # get address data from spreadsheet wb = xlrd.open_workbook(pardir + "\\" + countryFile) ws = wb.sheet_by_index(0) allInfo = [] rowInfo = [] for row_idx in range(1, ws.nrows): rowInfo.append(ws.cell_value(row_idx, 0)) # name rowInfo.append(ws.cell_value(row_idx, 4)) # address rowInfo.append(ws.cell_value(row_idx, 5)) # city rowInfo.append(ws.cell_value(row_idx, 6)) # state rowInfo.append(ws.cell_value(row_idx, 8)) # country rowInfo.append(ws.cell_value(row_idx, 7)) # poscode rowInfo.append(ws.cell_value(row_idx, 9)) # orders allInfo.append(rowInfo[:])
# Create a human-readable label and position it human_readable = os.path.splitext(os.path.split(filepath)[1])[0] b = shapes.String(width / 2.0, 15, human_readable, textAnchor="middle") # Create a space to write in a donor name c = shapes.String(30, (height - 30), "Donor name: ") label.add(a) label.add(b) label.add(c) # In[9]: sheet = labels.Sheet(specs, write_content, border=True) # In[10]: files = [os.path.join(wd, f) for f in os.listdir(wd)] # In[11]: sheet.add_labels(files) # Save the output to the current directory. To save somewhere else, supply a path. # In[12]: sheet.save('labels.pdf')
# Find top-left corner of data table. startRow = find_data(itemsSheet) # Find columns of source fields. srcFieldsDict = find_columns(srcFieldsList, itemsSheet) # Map source fields to required fields and write to labelSheet if 'Label' cell is non-empty. source_to_target(itemsSheet, startRow, maxRow, labelSheet, srcFieldsDict, reqFields) # Assign certification status based on memo cell. reqCol1 = reqFields['Memo'] reqCol2 = reqFields['Certification'] cert_status(labelSheet, reqCol1, reqCol2, certStatus) # Create the sheet. itemLabels = labels.Sheet(specs, write_name, border=False) gridTuple = numpair_tuples(topUsed, bottomUsed) itemLabels.partial_page(1, gridTuple) # Create PDF labels row by row from labelSheet. reqCol3 = reqFields['Label'] create_labels(labelSheet, itemLabels, reqCol3) # Uncomment the following block to save data to Excel file also. # This may be useful for debugging the above code. #try: # print('Saving Excel data...') # itemsWB.save(exportFile) # print('EST import data also saved to sheet "EST" of %s.' % (exportFile)) #except:
# # label.add(shapes.String(38, 30, str(obj[3]), fontName="3of9", fontSize=30)) # # label.add(shapes.String(2, 55, str(obj[4]), fontName="Helvetica", fontSize=14)) def make_barcode(code, acft): leading = '000' if acft == 'luh': leading = '720' elif acft == 'apache': leading = '640' code = leading + str(code) ean = barcode.get('ean13', code, writer=ImageWriter()) filename = ean.save('barcodes/{}'.format(code)) return filename # Create the sheet. sheet = labels.Sheet(specs, draw_label_top_bc, border=False) # trying to make barcode # ean = barcode.get('ean13', '1234121231234', writer=ImageWriter()) # filename = ean.save('ean13') # sheet.partial_page(1, ((1, 1), (2, 2), (4, 2))) # Add a couple of labels. s = '1234121231234' n = '{}-{}-{}-{}'.format(s[:-9],s[-9:-7],s[-7:-4],s[-4:]) # sheet.add_label([ 'Nomenclature','Part No.', 'Location', '1234121231234',n, '']) for row in db: if row[3] != '': nsn = '{}-{}-{}-{}'.format(row[4][:-9],row[4][-9:-7],row[4][-7:-4],row[4][-4:]) sheet.add_label([row[0],row[1],row[2],row[3],nsn, row[5]]) # sheet.add_label("Hello") # sheet.add_label("World")
# labels. Each label is 90mm x 25mm with a 2mm rounded corner. The margins are # automatically calculated. specs = labels.Specification(210, 297, 2, 8, 90, 25, corner_radius=2) # Create a function to draw each label. This will be given the ReportLab drawing # object to draw on, the dimensions (NB. these will be in points, the unit # ReportLab uses) of the label, and the object to render. def draw_label(label, width, height, obj): # Just convert the object to a string and print this at the bottom left of # the label. label.add(shapes.String(2, 2, str(obj), fontName="Helvetica", fontSize=40)) # Create the sheet. sheet = labels.Sheet(specs, draw_label, border=True) # Mark some of the labels on the first page as already used. sheet.partial_page(1, ((1, 1), (2, 2), (4, 2))) # Add a couple of labels. sheet.add_label("Hello") sheet.add_label("World") # Since the second page hasn't started yet, we can mark some of its labels as # already used too. sheet.partial_page(2, ((2, 1), (3, 1))) # We can also add each item from an iterable. sheet.add_labels(range(3, 22))
TTFont('Magnus Cederholm', os.path.join(font_path, 'FFF_Tusj.ttf'))) registerFont( TTFont('PermanentMarker', os.path.join(font_path, 'PermanentMarker.ttf'))) # load excel and loop through rows data_file = 'Fallfest Barcode File.xlsx' sheet_name = 'Barcodes' # parse data and create records = load_records_from_excel(data_file, sheet_name) tag = process_records(records) tag = fix_tags(tag) # create the sheet with callback function write_data to process each record specs = createAvery5160Spec() sheet = labels.Sheet(specs, write_data, border=True) if (DEBUG_PRINT): debug_print_tags(tag) else: if (PRINT_BY_ROW): print_tags_by_row(tag) else: print_tags_by_column(tag) #endif #endif # save results in pdf sheet.save('nametags.pdf') print("{0:d} label(s) output on {1:d} page(s).".format(sheet.label_count, sheet.page_count))
strokeWidth=1, fillColor=None)) label.add( shapes.String(width - 46, height - 36, part["id36"], fontName="Consolas Bold", fontSize=10)) # moved above the line. # label.add(shapes.String(width - 50, height - 110, "ID36", fontName="Consolas Bold", fontSize=8)) # removed manufacturer # label.add(shapes.String(10, height - 115, part["1stmanufacturer"], fontName="Consolas Bold", fontSize=6)) # Create the sheet. Use border to see the outline on an A4 sheet, # disable for printing on the actual envelopes (due to printer skew) # sheet = labels.Sheet(specs, draw_label, border=True) sheet = labels.Sheet(specs, draw_label, border=False) # Create labels for part in parts: sheet.add_label(part) sheet.save('labels.pdf') print("{0:d} label(s) output on {1:d} page(s).".format(sheet.label_count, sheet.page_count)) # if sheet.label_count > 1: # os.startfile(r'labels.pdf')
def save_breakout_sheet(self, labelsToPrint): breakouts = labelsToPrint SmallSheetHeads = labelPrinter.Sheet(self.smallSpecs, self.draw_cable_label, border=self.drawBorder) LargeSheetHeads = labelPrinter.Sheet(self.largeSpecs, self.draw_cable_label, border=self.drawBorder) BreakoutTailSheet = labelPrinter.Sheet(self.smallSpecs, self.draw_breakout_tail_label, border=self.drawBorder) OneBlockSheet = labelPrinter.Sheet(self.oneBlock5160, self.draw_oneBlock_label, border=self.drawBorder) # create lists of various things to print # first print small label heads smallLabelHeads = [] # then print large label heads largeLabelHeads = [] # then print male breakout tails maleBreakoutTails = [] # then print female breakout tails femaleBreakoutTails = [] for breakout in breakouts: if breakout.cableBreakout.mainLabelType == Label.objects.get( description__icontains='5167'): smallLabelHeads.append(breakout) if breakout.cableBreakout.mainLabelType == Label.objects.get( description__icontains='5160'): largeLabelHeads.append(breakout) breakoutTails = breakout.projectcablebreakoutpair_set.all() if 'Male' in breakout.cableBreakout.gender: maleBreakoutTails.append(breakoutTails) if 'Female' in breakout.cableBreakout.gender: femaleBreakoutTails.append(breakoutTails) """ topLeft = str(obj[0]) bottomLeft = str(obj[1]) topRight = str(obj[2]) bottomRight = str(obj[3]) middleCenter = str(obj[4]) bottomCenter = str(obj[5]) """ for b in smallLabelHeads: cable = b.cable topLeft = b.cableBreakout.breakoutName + ' ' + b.cableBreakout.gender try: if b.originOrDestination == 'origin': bottomLeft = '@' + cable.origin.locationDescription else: bottomLeft = '@' + cable.destination.locationDescription except: bottomLeft = '' bottomRight = '' aBundle = False if len(cable.cableName) > 11: name = cable.code else: name = cable.cableName data = [ topLeft, bottomLeft, '', bottomRight, name, '', aBundle, 'Small' ] SmallSheetHeads.add_label(data) if SmallSheetHeads.page_count != 0: theSheet = self.printdirectory + '01SmallBreakoutHeadLabels.pdf' SmallSheetHeads.save(theSheet) self.smallSheets.append(theSheet) self.smallPageCount += SmallSheetHeads.page_count for b in largeLabelHeads: cable = b.cable topLeft = b.cableBreakout.breakoutName + ' ' + b.cableBreakout.gender try: if b.originOrDestination == 'origin': bottomLeft = '@' + cable.origin.locationDescription else: bottomLeft = '@' + cable.destination.locationDescription except: bottomLeft = '' aBundle = False bottomRight = '' if len(cable.cableName) > 11: name = cable.code else: name = cable.cableName data = [ topLeft, bottomLeft, '', bottomRight, name, '', aBundle, 'Large' ] if cable.cable.cableType in ['06Pr Mult', '03Pr Mult']: print cable data[4] = cable.code OneBlockSheet.add_label(data) else: LargeSheetHeads.add_label(data) if LargeSheetHeads.page_count != 0: theSheet = self.printdirectory + '05LargeBreakoutHeadLabels.pdf' LargeSheetHeads.save(theSheet) self.largeSheets.append(theSheet) self.largePageCount += LargeSheetHeads.page_count if OneBlockSheet.page_count != 0: theSheet = self.printdirectory + '07LargeBreakoutHeadLabels.pdf' OneBlockSheet.save(theSheet) self.largeSheets.append(theSheet) self.largePageCount += OneBlockSheet.page_count for x in maleBreakoutTails: for b in x: """ topLeft = str(obj[0]) bottomLeft = str(obj[1]) topRight = str(obj[2]) bottomRight = str(obj[3]) middleCenter = str(obj[4]) bottomCenter = str(obj[5]) <div class="SmallLabelRightNumber">{{ pair.tailPairNumber }}</div> <div class="SmallLabelLeftUpperText">@ {{ pair.breakout.whichEnd }}</div> <div class="SmallLabelCenterText">{{ pair.tailLabel|sliceLabel:'10' }}</div> <div class="SmallLabelLeftText">{{ pair.breakout.cableBreakout.getShortName }}</div> <div class="SmallLabelRightText">{{ pair.breakout.cable.cableName }}</div> """ printObj = [] topLeft = '@ ' + b.breakout.whichEnd bottomLeft = '' topRight = b.breakout.cableBreakout.getShortName() name = b.breakout.cable.cableName if len(name) > 10: name = b.breakout.cable.code #bottomRight = name middleCenter = b.tailLabel bottomCenter = name + ' ' + b.tailPairNumber printObj = [ topLeft, bottomLeft, topRight, bottomRight, middleCenter, bottomCenter ] BreakoutTailSheet.add_label(printObj) for x in femaleBreakoutTails: for b in x: """ topLeft = str(obj[0]) bottomLeft = str(obj[1]) topRight = str(obj[2]) bottomRight = str(obj[3]) middleCenter = str(obj[4]) bottomCenter = str(obj[5]) <div class="SmallLabelRightNumber">{{ pair.tailPairNumber }}</div> <div class="SmallLabelLeftUpperText">@ {{ pair.breakout.whichEnd }}</div> <div class="SmallLabelCenterText">{{ pair.tailLabel|sliceLabel:'10' }}</div> <div class="SmallLabelLeftText">{{ pair.breakout.cableBreakout.getShortName }}</div> <div class="SmallLabelRightText">{{ pair.breakout.cable.cableName }}</div> """ printObj = [] topLeft = '@ ' + b.breakout.whichEnd bottomLeft = '' topRight = b.breakout.cableBreakout.getShortName() name = b.breakout.cable.cableName if len(name) > 10: name = b.breakout.cable.code #bottomRight = name middleCenter = b.tailLabel bottomCenter = name + ' ' + b.tailPairNumber printObj = [ topLeft, bottomLeft, topRight, bottomRight, middleCenter, bottomCenter ] BreakoutTailSheet.add_label(printObj) theSheet = self.printdirectory + '02BreakoutTailLabels.pdf' BreakoutTailSheet.save(theSheet) self.smallSheets.append(theSheet) self.smallPageCount += BreakoutTailSheet.page_count
font_size *= 0.8 name_width = stringWidth(name, "KatamotzIkasi", font_size) # Write out the name in the centre of the label with a random colour. s = shapes.String(width / 2.0, 15, name, textAnchor="middle") s.fontName = "KatamotzIkasi" s.fontSize = font_size s.fillColor = random.choice( (colors.black, colors.blue, colors.red, colors.green)) label.add(s) # Create the sheet. As we only intend to preview pages 1 and 3, there is no # point in actually calling the drawing function for other pages. We can tell # the constructor this and save some overhead. sheet = labels.Sheet(specs, write_name, border=True, pages_to_draw=[1, 3]) sheet.partial_page(1, ((1, 1), (2, 2), (4, 2))) # Use an external file as the data source. NB. we need to remove the newline # character from each line. with open(os.path.join(base_path, "names.txt")) as names: sheet.add_labels(name.strip() for name in names) # Save the previews. sheet.preview(1, 'nametags_page1.png') sheet.preview(3, 'nametags_page3.jpg', format='jpg') # Note that we can still save a PDF from here, but only pages 1 and 3 will have # content since we told the constructor those were all we wanted. sheet.save('nametags_from_preview.pdf')
def gen_nametags(competition_name, persons): ### Initialize font registerFont(TTFont('Trebuchet', NAMETAG_FONT_PATH)) # Format information for nametags: DIN-A4 layout with 2 rows of 4 nametags each with a size of 85x55mm specs = labels.Specification(210, 297, 2, 4, 85, 55) # Local function for nametag layout. Heavily uses add_text_field and is passed to sheet creation # obj is one list element of persons, i.e. one dict from utils/data_from_WCIF.get_nametag_data() def create_nametag(label, width, height, obj): competition_name = obj[0] person = obj[1] # Write competition name, competitor name and nation add_text_field(label, competition_name, width / 2.0, height - 25, max_width=width - 5, max_font_size=50, font="Helvetica") name = person['name'] # Add delegate / organizer color if person['delegate']: name_color = colors.red name = name + " (Delegate)" # Eventually replace with elif person['organizer']: name_color = colors.red name = name + " (Orga)" # emoji support (see constants at top of file) else: name_color = colors.black add_text_field(label, name, width / 2.0, height / 2.0, max_width=width - 5, max_font_size=25, color=name_color) add_text_field(label, person['nation'], width / 2.0, height / 3.0, max_width=150, max_font_size=20, color=colors.black) if person['wcaId'] == None: # Add newcomer label add_text_field(label, "Newcomer!", width / 2.0, FOOTER_HEIGHT, font_size=30, color=colors.green) else: # Add 3x3 PBs, comp_count and Best if person['_3x3']['single'] != -1 and person['_3x3'][ 'average'] != -1: rubiks_text = "3x3 PBs: {} S / {} A".format( format_result(person['_3x3']['single']), format_result(person['_3x3']['average'])) if (person['best']['eventName'] != '3x3x3'): add_text_field(label, rubiks_text, FOOTER_SIDE_MARGIN, FOOTER_HEIGHT + 10, font_size=10, color=colors.blue, position="start") best_text = "Best World Ranking: {} ({} {} of {})".format( person['best']['ranking'], person['best']['eventName'], person['best']['type'], format_result(person['best']['result'], person['best']['eventName'])) add_text_field(label, best_text, FOOTER_SIDE_MARGIN, FOOTER_HEIGHT, max_width=width - 20, max_font_size=10, color=colors.blue, position="start") comp_count = "Competition # " + str(person['numComps'] + 1) add_text_field(label, comp_count, width - FOOTER_SIDE_MARGIN, FOOTER_HEIGHT + 10, font_size=10, color=colors.blue, position="end") # Create the sheet and add labels sheet = labels.Sheet(specs, create_nametag, border=True) sheet.add_labels((competition_name, person) for person in persons) # Check if folder is there or create, and safe in folder competition_name_stripped = competition_name.replace(" ", "") if not os.path.exists(competition_name_stripped): os.makedirs(competition_name_stripped) nametag_file = competition_name_stripped + '/Nametags.pdf' sheet.save(nametag_file) print("{0:d} nametags output on {1:d} pages.".format( sheet.label_count, sheet.page_count))
def load_people(filename='people.json'): with open('people.json', 'r') as infile: return json.load(infile) # 215.9 by 279.4 def write_label(label, width, height, person): text = "\n".join((person['name'], person['addresses'][0])) lab = Label() lab.setOrigin(8, height - 5) lab.fontSize = 14 lab.setText(text) lab.boxAnchor = 'nw' label.add(lab) if __name__ == '__main__': people = load_people() for person in people: if len(person['addresses']) > 1: print "WARNING: {} has too many addresses!".format(person['name']) elif not person['addresses']: print "WARNING: {} has NO addresses!".format(person['name']) people = [ person for person in people if len(person['addresses']) == 1 ] OUT_FILENAME = 'labels.pdf' sheet = labels.Sheet(specs, write_label, border=BORDER) sheet.add_labels(people) with open(OUT_FILENAME, 'wb') as outfile: sheet.save(outfile) print "Wrote {}".format(OUT_FILENAME)
# Write the title. label.add(shapes.String(5, height-20, "Hello, my name is", fontName="Judson Bold", fontSize=20)) # Measure the width of the name and shrink the font size until it fits. font_size = 50 text_width = width - 10 name_width = stringWidth(name, "KatamotzIkasi", font_size) while name_width > text_width: font_size *= 0.8 name_width = stringWidth(name, "KatamotzIkasi", font_size) # Write out the name in the centre of the label with a random colour. s = shapes.String(width/2.0, 15, name, textAnchor="middle") s.fontName = "KatamotzIkasi" s.fontSize = font_size s.fillColor = random.choice((colors.black, colors.blue, colors.red, colors.green)) label.add(s) # Create the sheet. sheet = labels.Sheet(specs, write_name, border=True) sheet.partial_page(1, ((1, 1), (2, 2), (4, 2))) # Use an external file as the data source. NB. we need to remove the newline # character from each line. with open(os.path.join(base_path, "names.txt")) as names: sheet.add_labels(name.strip() for name in names) # Save the file and we are done. sheet.save('nametags.pdf') print("{0:d} label(s) output on {1:d} page(s).".format(sheet.label_count, sheet.page_count))
_, _, lx, ly = label.getBounds() _, _, gx, gy = group.getBounds() # Make sure the label fits in a sticker assert gx <= lx, (address, gx, lx) assert gy <= ly, (address, gy, ly) # Move the content to the center of the sticker dx = (lx - gx) / 2 dy = (ly - gy) / 2 group.translate(dx, dy) label.add(group) sheet = labels.Sheet(specs, draw_address, border=False) filename = 'addresses.csv' with open(filename, newline='') as csvfile: reader = csv.DictReader(csvfile, Address._fields, quotechar='"') for row in reader: # Make sure we got all fields, and no extra fields. assert None not in row, row['name'] assert 'zip' in row, row['name'] for k, v in row.items(): row[k] = v.strip() address = Address(**row) sheet.add_label(address)
def save_cable_sheet(self, labelsToPrint, smallOrLarge): cables = labelsToPrint if smallOrLarge == 'Small': sheet = labelPrinter.Sheet(self.smallSpecs, self.draw_cable_label, border=self.drawBorder) elif smallOrLarge == 'Large': sheet = labelPrinter.Sheet(self.largeSpecs, self.draw_cable_label, border=self.drawBorder) elif smallOrLarge == 'OneBlock': sheet = labelPrinter.Sheet(self.oneBlock5160, self.draw_oneBlock_label, border=self.drawBorder) for cable in cables: # loop through twice, first for origin, second for destination #cableType = topLeft topLeft = str(cable.cable.cableType) + ' ' + str(cable.length) try: bottomLeft = str(cable.getOriginGender() ) + '@' + cable.origin.locationDescription except: bottomLeft = str(cable.getOriginGender()) if cable.aBundle != None: bottomRight = cable.aBundle.name aBundle = True else: bottomRight = '' aBundle = False if smallOrLarge == 'OneBlock': name = cable.code else: if len(cable.cableName) > 11: name = cable.code else: name = cable.cableName data = [ topLeft, bottomLeft, '', bottomRight, name, '', aBundle, smallOrLarge ] sheet.add_label(data) # add a label break here. Origins Up here, Destinations down here # we should pad the row so that it works for both template types # pad the row until it is a new row currentPosition = sheet._position # returns [row#, column#] if smallOrLarge == 'Small': columnCount = self.smallSpecs.columns elif smallOrLarge == 'Large': columnCount = self.largeSpecs.columns elif smallOrLarge == 'OneBlock': columnCount = self.largeSpecs.columns # if the current column# doesn't equal the amount of columns, pad out the labels while currentPosition[1] != columnCount: sheet.add_label(['', '', '', '', '', '', '', smallOrLarge]) currentPosition = sheet._position if smallOrLarge == 'Small' or smallOrLarge == 'Large': sheet.add_label( ['', '', '', '', 'Origin Above', '', '', smallOrLarge]) sheet.add_label( ['', '', '', '', '__Destination__', '', '', smallOrLarge]) sheet.add_label( ['', '', '', '', 'Labels Below', '', '', smallOrLarge]) if smallOrLarge == 'Small': if self.settings.smallLabelTemplate == 'Avery 5167': sheet.add_label(['', '', '', '', '', '', '', smallOrLarge]) for cable in cables: # loop through twice, first for origin, second for destination #cableType = topLeft topLeft = str(cable.cable.cableType) + str(cable.length) try: bottomLeft = str(cable.getDestinationGender( )) + '@' + cable.destination.locationDescription except: bottomLeft = str(cable.getDestinationGender()) if cable.aBundle != None: bottomRight = cable.aBundle.name else: bottomRight = '' if smallOrLarge == 'OneBlock': name = cable.code else: if len(cable.cableName) > 11: name = cable.code else: name = cable.cableName aBundle = False data = [ topLeft, bottomLeft, '', bottomRight, name, '', aBundle, smallOrLarge ] sheet.add_label(data) if smallOrLarge == 'Large': theSheet = self.printdirectory + '03' + smallOrLarge + 'CableLabels.pdf' self.largeCableLabels = theSheet self.largeSheets.append(theSheet) self.largePageCount += sheet.page_count if smallOrLarge == 'OneBlock': theSheet = self.printdirectory + '04' + smallOrLarge + 'CableLabels.pdf' self.largeCableLabels = theSheet #self.largeSheets.append(theSheet) self.largePageCount += sheet.page_count elif smallOrLarge == 'Small': theSheet = self.printdirectory + '00' + smallOrLarge + 'CableLabels.pdf' self.smallSheets.append(theSheet) self.smallCableLabels = theSheet self.smallPageCount += sheet.page_count sheet.save(theSheet) return sheet
from reportlab.graphics import shapes # Create an A4 portrait (210mm x 297mm) sheets with 2 columns and 8 rows of # labels. Each label is 90mm x 25mm with a 2mm rounded corner. The margins are # automatically calculated. specs = labels.Specification(210, 297, 2, 8, 90, 25, corner_radius=2) def draw_label(label, width, height, obj): # Just convert the object to a string and print this at the bottom left of # the label. label.add(shapes.String(2, 2, str(obj), fontName="Helvetica", fontSize=12)) # Create the sheet. sheet = labels.Sheet(specs, draw_label) # Add a couple of labels. sheet.add_label("Hello" + "\n" + "Workd") sheet.add_label("World") # We can also add each item from an iterable. sheet.add_labels(range(3, 22)) # Note that any oversize label is automatically trimmed to prevent messing up # other labels. sheet.add_label("Oversized label here") # Save the file and we are done. sheet.save('basic.pdf')