Search code examples
pythonpdfreportlab

Reportlabs writing to multiple pages as shipping labels (full page) Python


I am very new to using Reportlabs and am trying to find a better way to go about generating full page shipping labels that look like this:

enter image description here

so far I have this code (allbeit poorly written):

import datetime

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

year = datetime.date.today().year

# IIRNumber = str(int(input("Month (digit): "))) + "-" + str(int(input("Shipment Number (include zero if before 10): ")))
# VMBENumber = "VBME-" + str(year)[-2:] + "-" + str(int(input("Enter VBME Number (last four digits: ")))
# PONUmber = input("Enter PO number or V for Various: ")
IIRNumber = "08-09"
VMBENumber = "VBME-21-1458"
PONUmber = "9185555"

ShipmentNumber = int(input("How many pieces in the shipment?: "))
print(VMBENumber)
print(IIRNumber)
print(ShipmentNumber)


def textobject_demo():

    my_canvas = canvas.Canvas("PDFGenerated.pdf",
                              pagesize=letter)
    # Create text_object
    text_object = my_canvas.beginText()
    # Set text location (x, y)


    # Write a line of text + carriage return
    # Set font face and size
    text_object.setFont('Times-Roman', 12)
    text_object.setTextOrigin(150, 730)

    for i in range(1, ShipmentNumber + 1):

        # Write text to the canvas
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text='To: Voisey Bay Mine Site – EXPANSION PROJECT (VBME)')
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="             C/O Innu Mikun Hangar")
        text_object.textLine(text="             Happy Valley-Goose Bay, NL")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="                     CC0012- " + VMBENumber + " - " + IIRNumber)
        text_object.textLine(text="                     Product Description:" + PONUmber)
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="                         Box " + str(i) + " of " + str(ShipmentNumber))
        text_object.textLine(text="                         Gross Weight: 14 lbs")
        text_object.textLine(text="                         Net Weight: 14 lbs")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="                         Dimensions: 9 L x 9 W x 9” H")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="             Special Storage Instruction: NO")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="")
        text_object.textLine(text="             Attn:   IIR – REDPATH Canada Limited")
        text_object.textLine(text="                         Underground Garage ATTN: Mark / Shawn")
        text_object.textLine(text="")
        my_canvas.drawText(text_object)
        my_canvas.showPage()

    my_canvas.save()


if __name__ == '__main__'
    textobject_demo()

is there a better way?

I am trying to streamline the way we generate these froms with python as apposed to copy and pasting the info per page

Thanks for any and all help

littlejiver


Solution

  • If any one is interested this is how I did it:

    from reportlab.pdfgen import canvas
    import pandas as pd
    import datetime
    
    po_numbers = []
    l_in_in = []
    w_in_in = []
    h_in_in = []
    alpha_letter = []
    weights = []
    
    data = pd.read_excel(r'/home/littlejiver/PycharmProjects/JSRFormGenerator/UOM conversions.xlsx')
    df = pd.DataFrame(data, columns=['Order', 'L (in)', 'W (in)', 'H (in)', 'Weight (lbs)', 'Letter'])
    
    alpha_or_num = input("Letters or Numbers (L or N)?: ")
    
    for i in df["Order"].dropna():
        po_numbers.append(str(i).replace(".0", ""))
    for i in df["L (in)"].dropna():
        l_in_in.append(i)
    for i in df["W (in)"].dropna():
        w_in_in.append(i)
    for i in df["H (in)"].dropna():
        h_in_in.append(i)
    for i in df["Letter"].dropna():
        alpha_letter.append(i)
        print(i)
    for i in df["Weight (lbs)"].dropna():
        weights.append(i)
    
    number_of_pieces = len(df[df.Order.notnull()])
    
    print(number_of_pieces)
    iir_number = "IIR " + input("Enter IIR Number (XX-XX): ")
    file_name = iir_number + " Shipping Labels.pdf"
    document_title = iir_number + " Shipping Labels.pdf"
    title = "To: Voisey's Bay Mine Site – EXPANSION PROJECT (VBME)"
    ship_to_address_line_1 = "C/o Innu Mikun Hangar"
    ship_to_address_line_2 = "Happy Valley-Goose Bay,"
    year = datetime.date.today().year
    vbme = input("Enter VMBE # (XXXX):")
    vbme_number = "CC0012 - VBME-" + str(year)[-2:] + "-" + vbme + " " + iir_number
    piece_number = " of " + str(number_of_pieces)
    special_storage_instruction = "No"
    attn_name_line_1 = "IIR – REDPATH Canada Limited"
    attn_name_line_2 = "Underground Garage ATTN: Mark / Shawn"
    
    pdf = canvas.Canvas(file_name)
    pdf.setTitle(document_title)
    
    
    def draw_my_ruler(pdf):
        pdf.drawString(100, 810, 'x100')
        pdf.drawString(200, 810, 'x200')
        pdf.drawString(300, 810, 'x300')
        pdf.drawString(400, 810, 'x400')
        pdf.drawString(500, 810, 'x500')
        pdf.drawString(600, 810, 'x600')
        pdf.drawString(700, 810, 'x700')
        pdf.drawString(800, 810, 'x800')
    
        pdf.drawString(10, 100, 'y100')
        pdf.drawString(10, 200, 'x200')
        pdf.drawString(10, 300, 'x300')
        pdf.drawString(10, 400, 'x400')
        pdf.drawString(10, 500, 'x500')
        pdf.drawString(10, 600, 'x600')
        pdf.drawString(10, 700, 'x700')
        pdf.drawString(10, 800, 'x800')
    
    
    def create_label_page(piece, po_number, length, width, height, aletter, weight):
        pdf.setFont('Times-Bold', 17)
        pdf.drawCentredString(300, 720, title)
    
        pdf.setFont('Times-Bold', 14)
        pdf.drawString(150, 680, ship_to_address_line_1)
        pdf.drawString(150, 665, ship_to_address_line_2)
        pdf.drawString(150, 650, ship_to_address_line_3)
    
        pdf.setFont('Times-Roman', 13)
        pdf.drawString(175, 600, vbme_number)
        pdf.drawString(175, 575, "Product Description: " + po_number)
        if alpha_or_num == "L":
            pdf.drawString(175, 550, "Piece: " + str(piece) + " of " + str(number_of_pieces) + " (" + aletter + ")")
        else:
            pdf.drawString(175, 550, "Piece: " + str(piece) + " of " + str(number_of_pieces))
        pdf.drawString(175, 550, "Piece: " + str(piece) + " of " + str(number_of_pieces))
        pdf.drawString(175, 525, "L " + str(length) + " x W " + str(width) + " x H " + str(height) + '"')
        pdf.drawString(175, 500, "Gross Weight: " + str(weight) + " Lbs")
        pdf.drawString(175, 475, "Net Weight: " + str(weight) + " Lbs")
        pdf.drawString(150, 375, "Special Storage Instructions: " + special_storage_instruction)
        pdf.setFont('Times-Bold', 13)
        pdf.drawString(175, 300, "Attn: " + attn_name_line_1)
        pdf.drawString(210, 285, attn_name_line_2)
    
        pdf.showPage()
    
    
    for num_po in range(1, len(po_numbers) + 1):
        print(str(num_po) + " of " + str(len(po_numbers)))
    
        create_label_page(num_po, po_numbers[num_po - 1], l_in_in[num_po - 1], w_in_in[num_po - 1], h_in_in[num_po - 1],
                          alpha_letter[num_po - 1], weights[num_po - 1])
    
    pdf.save()