Thanks for sharing your code.  It gave me a clue on how to append tables in 
the pdf file.  

I also found a web post 
(http://www.blog.pythonlibrary.org/2010/09/21/reportlab-tables-creating-tables-in-pdfs-with-python/)
 
that elaborates the use and manipulation of table styles.  I incorporated 
the aforementioned link to the code already provided in the web2py 
reference manual on Reportlab and it worked perfectly.

Here is the controller function:

def get_me_a_pdf():
    from reportlab.platypus import *
    from reportlab.lib.styles import getSampleStyleSheet
    from reportlab.rl_config import defaultPageSize
    from reportlab.lib.units import inch, mm
    from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
    from reportlab.lib import colors
    from uuid import uuid4
    from cgi import escape
    import os

    title = "This The Doc Title"
    heading = "First Paragraph"
    text = 'bla '* 100

    styles = getSampleStyleSheet()
    tmpfilename=os.path.join(request.folder,'private',str(uuid4()))
    doc = SimpleDocTemplate(tmpfilename)
    story = []
    story.append(Paragraph(escape(title),styles["Title"]))
    story.append(Paragraph(escape(heading),styles["Heading2"]))
    story.append(Paragraph(escape(text),styles["Normal"]))
    story.append(Spacer(1,0.5*inch))
    
    data= [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]
    t=Table(data)
    t.setStyle(TableStyle([('BACKGROUND',(1,1),(-2,-2),colors.green),
                           ('TEXTCOLOR',(0,0),(1,-1),colors.red)]))
    story.append(t)

    story.append(Spacer(1,0.5*inch))
    
    data= [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]
    t=Table(data,5*[0.4*inch], 4*[0.4*inch])
    t.setStyle(TableStyle([('ALIGN',(1,1),(-2,-2),'RIGHT'),
                       ('TEXTCOLOR',(1,1),(-2,-2),colors.red),
                       ('VALIGN',(0,0),(0,-1),'TOP'),
                       ('TEXTCOLOR',(0,0),(0,-1),colors.blue),
                       ('ALIGN',(0,-1),(-1,-1),'CENTER'),
                       ('VALIGN',(0,-1),(-1,-1),'MIDDLE'),
                       ('TEXTCOLOR',(0,-1),(-1,-1),colors.green),
                       ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                       ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                       ]))
 
    story.append(t)
    
    doc.build(story)
    data = open(tmpfilename,"rb").read()
    os.unlink(tmpfilename)
    response.headers['Content-Type']='application/pdf'
    return data
===================================================================== 

Indeed it's a lot of work, but at least it worked. :) 

On Thursday, May 28, 2015 at 3:41:49 PM UTC+8, Johann Spies wrote:
>
>
>
> On 28 May 2015 at 07:40, Jason (spot) Brower <enco...@gmail.com 
> <javascript:>> wrote:
>
>> Pdf reporting can take a lot of work. Is this for a single page report or 
>> many pages. How are formated? And do you have an examole report in pdf 
>> format?
>>
>>
> I have used it once and it works.  Here is the code as example:
>
> In the controller:
>
> from reportlab.platypus import *
> from reportlab.lib.styles import getSampleStyleSheet
> from reportlab.rl_config import defaultPageSize
> from reportlab.lib.units import inch, mm
> from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
> from reportlab.lib import colors
> from cgi import escape
> from reportlab.lib.pagesizes import inch, A4, landscape
> from reportlab.pdfgen import canvas
>
> def doccenter_pdf():
> #    import pdb
> #    pdb.set_trace()
>
>     query = request.vars.query
>     data = db(query).select(db.doccenter.doc_nr,
>                             db.doccenter_location.location,
>                             db.doccenter.author, db.doccenter.title,
>                             db.doccenter.institution,
>                             db.doccenter.reference, db.doccenter.source,
>                             db.doccenter.publication_date,
>                             db.doccenter.keywords,
>                             db.doccenter.anual_report,
>                             db.doccenter_category.category,
>                             orderby = db.doccenter.publication_date | 
> db.doccenter.author)
>     
>     title = T('Doccenter search result')
>     styles = getSampleStyleSheet()
>     tmpfilename = os.path.join(request.folder, 'private', str(uuid4()))
>
>
>     normalStyle = styles['Normal']
>
>     cols = [('doccenter', 'doc_nr'),
>             ('doccenter_location', 'location') ,
>             ('doccenter', 'author') ,
>             ('doccenter', 'title'),
>             ('doccenter', 'institution'),
>             ('doccenter', 'reference'),
>             ('doccenter', 'source'),
>             ('doccenter', 'publication_date'),
>             ('doccenter', 'keywords'),
>             ('doccenter', 'anual_report'),
>             ('doccenter_category', 'category')]
>
>     hds = ['doc_nr', 'location', 'author', 'title', 'institution',
>            'reference', 'source', 'date',
>             'keywords', 'anual_report', 'category']
>
>
>     headings = [Paragraph('''
>     <para align=left spaceb=3><b>%s</b> </para>''' % ' 
> '.join(c.split('_')).capitalize(),
>                           styles["BodyText"]) for c in hds]
>
>     lst = [headings]
>     for item in data:
>       
>         rec = []
>         for ikey in cols:
>             #import pdb; pdb.set_trace()
>             rec.append(par_from_item(item[ikey[0]][ikey[1]], styles))
>
>         lst.append(rec)
>
>
>     elements = []
>     elements.append(Paragraph(escape(title), styles['Title']))
>
>
>     # First the top row, with all the text centered and in Times-Bold,
>     # and one line above, one line below.
>     ts = [('ALIGN', (1, 1), (-1, -1), 'CENTER'),
>           ('LINEABOVE', (0, 0), (-1, 0), 1, colors.purple),
>           ('LINEBELOW', (0, 0), (-1, 0), 1, colors.purple),
>           ('FONT', (0, 0), (-1, 0), 'Times-Bold'),
>
>           # The bottom row has one line above, and three lines below of
>           # various colors and spacing.
>           ('LINEABOVE', (0, -1), (-1, -1), 1, colors.purple),
>           ('LINEBELOW', (0, -1), (-1, -1), 0.5, colors.purple,
>            1, None, None, 4, 1),
>           ('LINEBELOW', (0, -1), (-1, -1), 1, colors.red),
>           ('FONT', (0, -1), (-1, -1), 'Times-Bold')]
>
>     #  Alternate row background
>     for i, _ in enumerate(lst):
>         if odd(i):
>             ts.append(("BACKGROUND", (0, i), (-1, i), colors.cyan))
>     t = Table(lst, style = ts)
>     # Adjust column width
>     t._argW[3] = 1.8 * inch
>     t._argW[5] = 1.0 * inch
>     t._argW[0] = 1.0 * inch
>
>     t.setStyle(TableStyle())
>
>     elements.append(t)
>
>     doc = SimpleDocTemplate(tmpfilename, pagesize = landscape(A4))
>     doc.build(elements, canvasmaker = NumberedCanvas)
>     pdf = open(tmpfilename, "rb").read()
>     os.unlink(tmpfilename)
>     response.headers['Content-Type'] = 'application/pdf'
>     return pdf
>
> As you can see there was a lot of work and experimenting involved.
>
> Regards
> Johann
> -- 
> Because experiencing your loyal love is better than life itself, 
> my lips will praise you.  (Psalm 63:3)
>  

-- 
“This message contains confidential information and is intended only for 
the individual named. If you are not the named addressee you should not 
disseminate, distribute or copy this e-mail. Please notify the sender 
immediately by e-mail if you have received this e-mail by mistake and 
delete this e-mail from your system. E-mail transmission cannot be 
guaranteed to be secure or error-free as information could be intercepted, 
corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. 
The sender therefore does not accept liability for any errors or omissions 
in the contents of this message, which arise as a result of e-mail 
transmission. If verification is required please request a hard-copy 
version.” Bicol University, Legazpi City, Philippines.

-- 
“This message contains confidential information and is intended only for 
the individual named. If you are not the named addressee you should not 
disseminate, distribute or copy this e-mail. Please notify the sender 
immediately by e-mail if you have received this e-mail by mistake and 
delete this e-mail from your system. E-mail transmission cannot be 
guaranteed to be secure or error-free as information could be intercepted, 
corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. 
The sender therefore does not accept liability for any errors or omissions 
in the contents of this message, which arise as a result of e-mail 
transmission. If verification is required please request a hard-copy 
version.” Bicol University, Legazpi City, Philippines.

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to