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)