1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
12 from reportlab.platypus.doctemplate import SimpleDocTemplate
13 from reportlab.platypus import PageBreak
14 from vstf.controller.reporters.report.pdf.styles import TemplateStyle, ps_head_lv1, ps_head_lv2, ps_head_lv3
15 import vstf.common.constants as cst
18 class BaseDocTemplate(SimpleDocTemplate):
19 def __init__(self, filename, **kw):
20 self.allowSplitting = 0
21 SimpleDocTemplate.__init__(self, filename, **kw)
23 def afterFlowable(self, flowable):
24 """Registers TOC entries."""
25 if flowable.__class__.__name__ == 'Paragraph':
26 text = flowable.getPlainText()
27 style = flowable.style.name
28 if style == ps_head_lv1.name:
29 self.notify('TOCEntry', (0, text, self.page - 1))
30 elif style == ps_head_lv2.name:
31 self.notify('TOCEntry', (1, text, self.page - 1))
32 elif style == ps_head_lv3.name:
33 self.notify('TOCEntry', (2, text, self.page - 1))
36 class PdfTemplate(object):
37 def __init__(self, title, logo, header, footer, note=[], style="default"):
38 self._style = TemplateStyle(name=style)
41 #self._header = header[0]
44 info = " Generated on %s " % time.strftime(cst.TIME_FORMAT2, time.localtime())
47 def myFirstPage(self, canvas, doc):
48 raise NotImplementedError("abstract StoryDecorator")
50 def myLaterPages(self, canvas, doc):
51 raise NotImplementedError("abstract StoryDecorator")
53 def generate(self, story, output):
54 sizes = (self._style.page_wight, self._style.page_height)
55 doc = BaseDocTemplate(output, pagesize=sizes)
56 # doc.build(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
57 doc.multiBuild(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
60 class PdfVswitch(PdfTemplate):
61 def myFirstPage(self, canvas, doc):
63 title_lines = len(self._title)
64 line_size = [self._style.title_size] * title_lines
67 canvas.drawImage(self._logo,
68 (self._style.page_wight - self._style.logo_width) / 2.0,
69 self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(lambda x, y: x + y,
71 self._style.logo_width,
72 self._style.logo_height
74 for i in range(title_lines):
75 canvas.setFont(self._style.title_font, line_size[i])
76 canvas.drawCentredString(self._style.page_wight / 2.0,
77 self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(
78 lambda x, y: x + y, line_size[i + 1:]),
81 size = self._style.body_size
82 canvas.setFont(self._style.body_font, size)
83 note_line = len(self._note)
85 for i in range(note_line):
87 canvas.drawCentredString(self._style.page_wight / 2.0,
88 self._style.page_height / 5.0 + (1 + self._style.body_leading) * size * (
92 size = self._style.body_size - 2
93 canvas.setFont(self._style.body_font, size)
94 canvas.drawCentredString(self._style.page_wight / 2.0,
95 self._style.page_bottom / 2.0 + (1 + self._style.body_leading) * size,
99 def myLaterPages(self, canvas, doc):
101 canvas.setLineWidth(self._style.line_width)
102 canvas.line(self._style.page_left,
103 self._style.page_height - self._style.page_top,
104 self._style.page_wight - self._style.page_right,
105 self._style.page_height - self._style.page_top
107 size = self._style.body_size - 2
108 canvas.setFont(self._style.body_font, size)
109 canvas.drawCentredString(self._style.page_wight / 2.0,
110 self._style.page_bottom - 24,
111 "%s%s Page %2d " % (self._footer[0], " " * 8, doc.page - 1)
113 canvas.restoreState()