├── version ├── .vscode └── settings.json ├── assets ├── back12.jpg ├── header.jpeg ├── header.jpg ├── original.pdf ├── voucher.pdf ├── zb-logo.png ├── background.jpg ├── ZB Statement1.pdf ├── ZB Statement2.pdf ├── ZB Statement3.pdf ├── background.jpeg ├── background1.jpeg └── ZB Statement footer.jpg ├── generated-pdf ├── JPGK24VJ.pdf └── RN6NJLUV.pdf ├── __pycache__ └── send_email.cpython-38.pyc ├── README.md ├── templates ├── footer.html └── base_template.html ├── create-pdf.py ├── send_email.py └── convert_pop_to_pdf.py /version: -------------------------------------------------------------------------------- 1 | 0.0.3 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.formatting.provider": "black" 3 | } -------------------------------------------------------------------------------- /assets/back12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/back12.jpg -------------------------------------------------------------------------------- /assets/header.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/header.jpeg -------------------------------------------------------------------------------- /assets/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/header.jpg -------------------------------------------------------------------------------- /assets/original.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/original.pdf -------------------------------------------------------------------------------- /assets/voucher.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/voucher.pdf -------------------------------------------------------------------------------- /assets/zb-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/zb-logo.png -------------------------------------------------------------------------------- /assets/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/background.jpg -------------------------------------------------------------------------------- /assets/ZB Statement1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/ZB Statement1.pdf -------------------------------------------------------------------------------- /assets/ZB Statement2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/ZB Statement2.pdf -------------------------------------------------------------------------------- /assets/ZB Statement3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/ZB Statement3.pdf -------------------------------------------------------------------------------- /assets/background.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/background.jpeg -------------------------------------------------------------------------------- /assets/background1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/background1.jpeg -------------------------------------------------------------------------------- /generated-pdf/JPGK24VJ.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/generated-pdf/JPGK24VJ.pdf -------------------------------------------------------------------------------- /generated-pdf/RN6NJLUV.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/generated-pdf/RN6NJLUV.pdf -------------------------------------------------------------------------------- /assets/ZB Statement footer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/assets/ZB Statement footer.jpg -------------------------------------------------------------------------------- /__pycache__/send_email.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nigelreign/pdf-generator/HEAD/__pycache__/send_email.cpython-38.pyc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ##PDF Generator 2 | 3 | #how to install 4 | 5 | ```python3 -m pip install reportlab ``` 6 | ```python3 -m pip install PyPDF2 ``` 7 | -------------------------------------------------------------------------------- /templates/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/create-pdf.py:
--------------------------------------------------------------------------------
1 | from PyPDF2 import PdfFileWriter, PdfFileReader
2 | import io
3 | from reportlab.pdfgen import canvas
4 | from reportlab.lib.pagesizes import letter
5 | from send_email import EmailController as email_controller
6 |
7 |
8 | def create_pdf(
9 | amount: str,
10 | voucher_number: str,
11 | ):
12 | """Create PDF
13 |
14 | Args:
15 | amount: amount
16 | voucher: voucher
17 |
18 | """
19 | packet = io.BytesIO()
20 |
21 | can = canvas.Canvas(packet, pagesize=letter)
22 |
23 | can.setFillColor("#144f5d") #
24 | can.setFont("Helvetica-Bold", 35)
25 | can.drawString(40, 130, amount)
26 |
27 | can.setFillColor("#144f5d") #
28 | can.setFont("Helvetica-Bold", 10)
29 | can.drawString(600, 250, voucher_number)
30 |
31 | can.setFillColor("#144f5d") #
32 | can.setFont("Helvetica-Bold", 20)
33 | can.drawString(300, 120, voucher_number)
34 | can.save()
35 |
36 | packet.seek(0)
37 | new_pdf = PdfFileReader(packet)
38 | # getting the existing pdf file
39 | existing_pdf = PdfFileReader(open("assets/voucher.pdf", "rb"))
40 | output = PdfFileWriter()
41 |
42 | # add our text to the pdf
43 | page = existing_pdf.getPage(0)
44 | page.mergePage(new_pdf.getPage(0))
45 | output.addPage(page)
46 |
47 | # genertate a new pdf
48 | outputStream = open("generated-pdf/" + voucher_number + ".pdf", "wb")
49 | output.write(outputStream)
50 | outputStream.close()
51 |
52 | # email_controller.send_pop_as_email(transaction_reference)
53 |
54 |
55 | amount = "$USD50"
56 | voucher_number = "EW5144522885505575112"
57 |
58 | # i = 0
59 | # while i < 100:
60 | create_pdf(
61 | amount=amount,
62 | voucher_number=voucher_number,
63 | )
64 |
65 | # i += 1
66 |
--------------------------------------------------------------------------------
/send_email.py:
--------------------------------------------------------------------------------
1 | import smtplib
2 | from email.mime.multipart import MIMEMultipart
3 | from email.mime.text import MIMEText
4 | from email.mime.base import MIMEBase
5 | from email import encoders
6 |
7 | class EmailController:
8 |
9 | def send_pop_as_email(transaction_reference):
10 | """Send generated pdf as email
11 |
12 | Args:
13 | transaction_reference: transaction_reference
14 |
15 |
16 | """
17 | # body of the email
18 | body = '''
19 | Good day,
20 | Please find attached a copy of your proof of payment
21 |
22 | Kind regards
23 | Nigel Zulu
24 | '''
25 | # ============================================
26 | # sender email address eg zulunigelb@gmail.com
27 | # these will be used to authenticate to gmail
28 | sender = 'test@nigel.zulu'
29 | password = '*******'
30 |
31 | # enter the reciever email address eg danielzulu@gmail.com
32 | receiver = 'zulunigelb@gmail.com'
33 |
34 | message = MIMEMultipart()
35 | message['From'] = sender
36 | message['To'] = receiver
37 | message['Subject'] = 'ZB BANK PROOF OF PAYMENT'
38 |
39 | message.attach(MIMEText(body, 'plain'))
40 |
41 | # select the file you want to send
42 | pdfname = 'generated-pdf/'+transaction_reference+'.pdf'
43 |
44 | # rewrite the name of the pdf
45 | pdffilename = transaction_reference+'.pdf'
46 |
47 | # prepare payload
48 | binary_pdf = open(pdfname, 'rb')
49 |
50 | payload = MIMEBase('application', 'pdf', Name=pdfname)
51 | payload.set_payload((binary_pdf).read())
52 |
53 | encoders.encode_base64(payload)
54 |
55 | payload.add_header('Content-Disposition', 'attachment', filename=pdffilename)
56 | message.attach(payload)
57 |
58 | #use gmail with port
59 | session = smtplib.SMTP('smtp.gmail.com', 587)
60 |
61 | #enable security
62 | session.starttls()
63 |
64 | #login with mail_id and password
65 | session.login(sender, password)
66 |
67 | text = message.as_string()
68 | session.sendmail(sender, receiver, text)
69 | session.quit()
70 | print('Mail Sent')
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/convert_pop_to_pdf.py:
--------------------------------------------------------------------------------
1 | from jinja2 import Environment, FileSystemLoader
2 | import os
3 | import pdfkit
4 | from PyPDF2 import PdfFileWriter, PdfFileReader
5 | import random
6 | import string
7 |
8 | def generate_pop(
9 | account_holder_name: str,
10 | account_holder_full_name: str,
11 | account_holder_address: str,
12 | account_holder_city_country: str,
13 | account_number: str,
14 | currency: str,
15 | account_type: str,
16 | transactions: list,
17 | ):
18 | """Create POP PDF
19 |
20 | Args:
21 | account_holder_name: account_holder_name,
22 | account_holder_full_name: account_holder_full_name,
23 | account_holder_address: account_holder_address,
24 | account_holder_city_country: account_holder_city_country,
25 | account_number: account_number,
26 | currency: currency,
27 | account_type: account_type,
28 | transactions: [
29 | {
30 | "date": "07 Jun 21",
31 | "description": {
32 | "narration1":"OPENNING BALANCE",
33 | "narration2":"",
34 | "narration3":"",
35 | "narration4":"",
36 | "narration5":"",
37 | },
38 | "debit": "",
39 | "credit": "",
40 | "balance": "100,000.19",
41 | },
42 |
43 | ],
44 |
45 | """
46 | # pass variables to our html template
47 | env = Environment(loader=FileSystemLoader(os.getcwd()))
48 | template = env.get_template("templates/base_template.html")
49 | html = template.render(
50 | account_holder_name=account_holder_name.upper(),
51 | account_holder_full_name=account_holder_full_name.upper(),
52 | account_holder_address=account_holder_address.upper(),
53 | account_holder_city_country=account_holder_city_country.upper(),
54 | account_number=account_number.upper(),
55 | currency=currency.upper(),
56 | account_type=account_type.upper(),
57 | transactions=transactions,
58 | )
59 |
60 | # save the generated html file
61 | file = open("templates/temp-generated-html/"+account_number+".html", "w")
62 | file.write(html)
63 | file.close()
64 |
65 |
66 | options = {
67 | "page-size": "Letter",
68 | "margin-top": "0.0in",
69 | "margin-right": "0.0in",
70 | "margin-bottom": "1.5in",
71 | "margin-left": "0.0in",
72 | "encoding": "UTF-8",
73 | "footer-html": "templates/footer.html",
74 | # '--header-html': 'header.html',
75 | "custom-header": [("Accept-Encoding", "gzip")],
76 | "no-outline": None,
77 | }
78 |
79 | # convert the html file to a pdf file
80 | pdfkit.from_file("templates/temp-generated-html/"+account_number+".html", "generated-pdf/"+account_number+".pdf", options=options)
81 |
82 | os.remove("templates/temp-generated-html/"+account_number+".html")
83 |
84 |
85 | account_holder_name = "Nigel Bongani Zulu"
86 | account_holder_full_name = "Nigel Zulu"
87 | account_holder_address = "71314 Lobengula West"
88 | account_holder_city_country = "Bulawayo, Harare"
89 | account_number = "1003088252"
90 | currency = "ZWL"
91 | account_type = "Saving Account"
92 |
93 | transactions = [
94 | {
95 | "date": "07 Jun 21",
96 | "description": {
97 | "narration1":"OPENNING BALANCE",
98 | "narration2":"",
99 | "narration3":"",
100 | "narration4":"",
101 | "narration5":"",
102 | },
103 | "debit": "",
104 | "credit": "",
105 | "balance": "100,000.19",
106 | },
107 |
108 | {
109 | "date": "07 Feb 21",
110 | "description": {
111 | "narration1":"WHATSAPP BALANCE ENQ",
112 | "narration2":"200T60187205725",
113 | "narration3":"WHATSAPP|CHARGES",
114 | "narration4":"4144601872200|4131847336932",
115 | "narration5":"263775580596",
116 | },
117 | "debit": "22000.00",
118 | "credit": "",
119 | "balance": "22035.19",
120 | },
121 | {
122 | "date": "07 Feb 21",
123 | "description": {
124 | "narration1":"WHATSAPP BALANCE ENQ",
125 | "narration2":"200T60187205725",
126 | "narration3":"WHATSAPP|CHARGES",
127 | "narration4":"4144601872200|4131847336932",
128 | "narration5":"263775580596",
129 | },
130 | "debit": "",
131 | "credit": "22000.00",
132 | "balance": "22035.19",
133 | },
134 |
135 | ]
136 |
137 | # i = 0
138 | # while i < 2:
139 | # test_account_number = "".join(
140 | # random.choice(string.ascii_uppercase + string.digits) for i in range(8)
141 | # )
142 |
143 | generate_pop(
144 | account_holder_name=account_holder_name,
145 | account_holder_full_name=account_holder_full_name,
146 | account_holder_address=account_holder_address,
147 | account_holder_city_country=account_holder_city_country,
148 | account_number=test_account_number,
149 | currency=currency,
150 | account_type=account_type,
151 | transactions=transactions,
152 | )
153 |
154 | # i += 1
155 |
--------------------------------------------------------------------------------
/templates/base_template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
81 |
82 |
83 |
84 |
85 |
87 |
88 |