5 from reportlab.platypus.doctemplate import SimpleDocTemplate
6 from reportlab.platypus import PageBreak
7 from vstf.controller.reporters.report.pdf.styles import TemplateStyle, ps_head_lv1, ps_head_lv2, ps_head_lv3
10 class MyDocTemplate(SimpleDocTemplate):
11 def __init__(self, filename, **kw):
12 self.allowSplitting = 0
13 SimpleDocTemplate.__init__(self, filename, **kw)
15 def afterFlowable(self, flowable):
16 """Registers TOC entries."""
17 if flowable.__class__.__name__ == 'Paragraph':
18 text = flowable.getPlainText()
19 style = flowable.style.name
20 if style == ps_head_lv1.name:
21 self.notify('TOCEntry', (0, text, self.page - 1))
22 elif style == ps_head_lv2.name:
23 self.notify('TOCEntry', (1, text, self.page - 1))
24 elif style == ps_head_lv3.name:
25 self.notify('TOCEntry', (2, text, self.page - 1))
29 def __init__(self, style, title, logo, header, footer, output, note=None):
33 self._header = header[0]
35 self._output = output[0]
37 info = " Generated on %s " % time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())
40 def myFirstPage(self, canvas, doc):
41 raise NotImplementedError("abstract StoryDecorator")
43 def myLaterPages(self, canvas, doc):
44 raise NotImplementedError("abstract StoryDecorator")
46 def generate(self, story):
47 sizes = (self._style.page_wight, self._style.page_height)
48 doc = MyDocTemplate(self._output, pagesize=sizes)
49 # doc.build(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
50 doc.multiBuild(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
53 class PdfVswitch(PdfTemplate):
54 def myFirstPage(self, canvas, doc):
56 title_lines = len(self._title)
57 line_size = [self._style.title_size] * title_lines
60 canvas.drawImage(self._logo,
61 (self._style.page_wight - self._style.logo_width) / 2.0,
62 self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(lambda x, y: x + y,
64 self._style.logo_width,
65 self._style.logo_height
67 for i in range(title_lines):
68 canvas.setFont(self._style.title_font, line_size[i])
69 canvas.drawCentredString(self._style.page_wight / 2.0,
70 self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(
71 lambda x, y: x + y, line_size[i + 1:]),
74 size = self._style.body_size
75 canvas.setFont(self._style.body_font, size)
76 note_line = len(self._note)
78 for i in range(note_line):
80 canvas.drawCentredString(self._style.page_wight / 2.0,
81 self._style.page_height / 5.0 + (1 + self._style.body_leading) * size * (
85 size = self._style.body_size - 2
86 canvas.setFont(self._style.body_font, size)
87 canvas.drawCentredString(self._style.page_wight / 2.0,
88 self._style.page_bottom / 2.0 + (1 + self._style.body_leading) * size,
92 def myLaterPages(self, canvas, doc):
94 canvas.setLineWidth(self._style.line_width)
95 canvas.line(self._style.page_left,
96 self._style.page_height - self._style.page_top,
97 self._style.page_wight - self._style.page_right,
98 self._style.page_height - self._style.page_top
100 size = self._style.body_size - 2
101 canvas.setFont(self._style.body_font, size)
102 canvas.drawCentredString(self._style.page_wight / 2.0,
103 self._style.page_bottom - 24,
104 "%s%s Page %2d " % (self._footer[0], " " * 8, doc.page - 1)
106 canvas.restoreState()