import sys from reportlab.platypus import Frame, Paragraph, SimpleDocTemplate, Spacer, Table, TableStyle, TopPadder from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib.pagesizes import A4 from reportlab.lib.units import inch from reportlab.lib import colors PAGE_HEIGHT = A4[1] PAGE_WIDTH = A4[0] MARGIN = inch * 0.5 INNER_PAGE_WIDTH = PAGE_WIDTH - (MARGIN * 2) def firstPage(canvas, doc): canvas.saveState() # Logo canvas.drawImage( "logo.png", PAGE_WIDTH-292, PAGE_HEIGHT-150, width=250, height=143, mask="auto") # Invoice detail styles = getSampleStyleSheet() styleH2 = styles['Heading2'] styleH3 = styles['Heading3'] content = [] frame_width = PAGE_WIDTH*0.45 content.append(Paragraph("INVOICE", styleH2)) data = [ ['Customer no:', 3004322], ['Invoice-no:', '4912/1231245135362634'], ['Reference:', '33340|MAY21'], ['Invoice date:', '21.06.2021'], ['VAT reg.no.:', 'GB2021567788'], ['Our VAT reg.no.:', 'GB1234561616'], ['Tax number:', '821012314'], ['Originator:', '33340|MAY21'], ] table = Table(data, colWidths=[frame_width*0.4, frame_width*0.6]) table.setStyle(TableStyle([ ('TOPPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ('FONTNAME', (1, 0), (1, -1), 'Helvetica-Bold'), ])) content.append(table) content.append(Paragraph("Contact person:", styleH3)) data = [ ['Clerk:', 'Credit control department'], ['Telephone:', '+44 (0) 1234 1234556'], ] table = Table(data, colWidths=[frame_width*0.4, frame_width*0.6]) table.setStyle(TableStyle([ ('TOPPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ])) content.append(table) frame = Frame(PAGE_WIDTH/2, PAGE_HEIGHT - 326, frame_width, 200, showBoundary=1) frame.addFromList(content, canvas) canvas.restoreState() def otherPages(canvas, doc): canvas.saveState() #canvas.setFont('Times-Roman',9) #canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo)) canvas.restoreState() def build_document(path): doc = SimpleDocTemplate( path, pagesize=A4, leftMargin=MARGIN, rightMargin=MARGIN, topMargin=MARGIN, bottomMargin=MARGIN) content = [Spacer(1, inch * 1.4)] styles = getSampleStyleSheet() style = styles["Normal"] text = """ Accepting Authority:



Twenty8Twelve Ltd
337 Latimer Road
London
W10 6RA """ content.append(Paragraph(text, style)) content.append(Spacer(1, 1.4 * inch)) data = [ ['Invoice of Essential Music & Marketing Limited', 'NET PRICE GBP', 'Vat Code'], ['33340|1005|Digital Distn Fee EMD|MAY 21', '2.86', 'AX'], ['33340|1007|Digital Distn Fee Audio Subscr.|MAY 21', '45.21', 'AX'], ['33340|1008|Digital Distn Fee Video Subscr.|MAY 21', '1.61', 'AX'], ['33340|1025|Broadcast Distn Fee Broadcast|MAY 21', '0.02', 'AX'], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ] table = Table( data, colWidths=[INNER_PAGE_WIDTH * 0.7, INNER_PAGE_WIDTH * 0.2, INNER_PAGE_WIDTH * 0.1]) table.setStyle(TableStyle([ ('ALIGNMENT', (-2, 0), (-1, -1), 'RIGHT'), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTNAME', (0, 0), (0, 0), 'Helvetica-BoldOblique'), ('FONTSIZE', (0, 0), (0, 0), 14), ('LINEABOVE', (0, 1), (-1, 1), 0.25, colors.black), ('LINEBEFORE', (1, 0), (1, -1), 0.25, colors.black), ('BOTTOMPADDING', (0, 0), (-1, 0), inch * 0.25), ])) content.append(table) data = [ ['Subtotal', '', '', '', '0.02', 'AX'], ['VAT', 'AX', '20.00 %', '49.66', '9.93', 'GBP'], ['Total', '', '', '', '59.63', 'AX'], ] table = Table(data, colWidths=[ INNER_PAGE_WIDTH * 0.1, INNER_PAGE_WIDTH * 0.1, INNER_PAGE_WIDTH * 0.25, INNER_PAGE_WIDTH * 0.25, INNER_PAGE_WIDTH * 0.2, INNER_PAGE_WIDTH * 0.1]) table.setStyle(TableStyle([ ('ALIGNMENT', (-2, 0), (-1, -1), 'RIGHT'), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), ('FONTNAME', (0, 2), (-1, 2), 'Helvetica-Bold'), ('LINEBEFORE', (-2, 0), (-2, -1), 0.25, colors.black), ('SPAN', (0, 0), (1, 0)), ('SPAN', (0, 2), (1, 2)), ('TOPPADDING', (0, 0), (-1, 0), inch * 0.25), ])) content.append(table) data = [ ['Terms of payment:', 'Payable immediately without deduction', '59.63 GBP payable 21.06.2021'] ] table = Table(data, colWidths=[ INNER_PAGE_WIDTH * 0.2, INNER_PAGE_WIDTH * 0.45, INNER_PAGE_WIDTH * 0.35]) table.setStyle(TableStyle([ ('FONTNAME', (0, 0), (0, 0), 'Helvetica-Bold'), ('FONTSIZE', (0, 0), (-1, -1), 8), ])) content.append(table) content.append(Spacer(1, 0.05 * inch)) text = """ Orchard UK, Account: 12314255 (GBP), Sort code: 20-00-00, IBAN: GB07BARC 2000 0033 1235 43
Orchard UK, Account: 86827725 (USD), Sort code: 20-00-00, IBAN: GB07BARC 2000 0033 7654 33
Orchard UK, Account: 87684932 (EUR), Sort code: 20-00-00, IBAN: GB07BARC 2000 0033 9995 12
Essential Music & Marketing Ltd T/A The Orchard UK
Registered Office: 9, Derry Street, London
""" content.append(Paragraph(text, style)) doc.build(content, onFirstPage=firstPage, onLaterPages=otherPages) if __name__ == "__main__": path = sys.argv[1] if len(sys.argv) > 1 else "document.pdf" build_document(path)