Mav
Mav

Reputation: 171

creating a new PDF from existing PDF in Python

I'm struggling how to create a PDF report using another PDF as template in Python. I have a PDF file ( Template.pdf) that can be used as the template to create report every day. Template.pdf looks like following:

 ABC Corp

Daily Sales Report         Report Date:                                 

SalesName OrderQty ConfirmedQty ShippedQty




I need to programatically fill ReportDate, and sales data and prepare the report in PDF format as shown below: ABC Corp


Daily Sales Report         Report Date: 20120117                        

SalesName OrderQty ConfirmedQty ShippedQty


Jason 1000 900 50


Peter 500 50 450


Murali 2000 1000 900


It can be assumed that no. of sales person are fixed (i.e. no. of rows are fixed in report).

Upvotes: 1

Views: 2377

Answers (1)

Nicholas TJ
Nicholas TJ

Reputation: 1649

You could try reportlab as your pdf template is relatively easy. I'm not sure where you'll pull your data from and how exactly does your template looks like, but I'd written a small code to let you see or get started up. It's better if you could go through reportlab's user guide.

You could check out html to pdf for python solution. It should be what you're looking for as well.

Reportlab example:

import datetime

from reportlab.pdfgen import canvas
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.pagesizes import A4, letter, inch, cm
from reportlab.platypus import Paragraph, SimpleDocTemplate, Table, TableStyle, Spacer, KeepTogether, CondPageBreak
from reportlab.lib import colors
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
styles = getSampleStyleSheet()

class Sales( object ):
    def __init__(self):
        self.salesname = 'Jason'
        self.orderqty = 1000
        self.confirmqty = 900
        self.shipqty = 50        

jason = Sales()  

# get current date
date = datetime.date.today()
jahr = date.year
monat = date.month
tag = date.day

story = []

# Styles
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER
styleH = styles["Heading2"]

# Static texts
title = "ABC Corp"
subtitle = "Daily Sales Report"

# Headers
hdescrpcion = Paragraph('''<b>SalesName</b>''', styleBH)
hpartida = Paragraph('''<b>OrderQty</b>''', styleBH)
hcandidad = Paragraph('''<b>ConfirmedQty</b>''', styleBH)
hprecio_unitario = Paragraph('''<b>ShippedQty</b>''', styleBH)

# Date
mydate = Paragraph('''Report Date: '''+str(jahr)+'''-'''+str(monat)+'''-'''+str(tag), styleN)

# 2 col data
data_2col =[[subtitle,mydate]]
table2 = Table(data_2col, colWidths=[5.05 * cm, 5* cm])

# 4 col data
data= [[hdescrpcion, hpartida,hcandidad, hprecio_unitario],
       [jason.salesname, jason.orderqty, jason.confirmqty, jason.shipqty]]

table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 5 * cm,
                           3* cm])

table.setStyle(TableStyle([
                       ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                       ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                       ]))

story.append(Paragraph(title,styleH))
story.append(Spacer(1, 12))
story.append(table2)
story.append(Spacer(1, 12))
story.append(table)

doc = SimpleDocTemplate('template.pdf',pagesize = A4,rightMargin=18,leftMargin=18,
                        topMargin=18,bottomMargin=18, showBoundary=False, allowSplitting = True)

doc.build(story)

Upvotes: 2

Related Questions