author | robin <robin@reportlab.com> |
Tue, 07 Mar 2017 10:00:34 +0000 | |
changeset 4330 | 617ffa6bbdc8 |
parent 3617 | ae5744e97c42 |
child 4370 | 823a8c33ce43 |
permissions | -rw-r--r-- |
4330 | 1 |
#Copyright ReportLab Europe Ltd. 2000-2017 |
2963 | 2 |
#see license.txt for license details |
3 |
#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/tools/docco/rltemplate.py |
|
4 |
# doc template for RL manuals. Currently YAML is hard-coded |
|
5 |
#to use this, which is wrong. |
|
6 |
||
7 |
||
8 |
from reportlab.platypus import PageTemplate, \ |
|
9 |
BaseDocTemplate, Frame, Paragraph |
|
10 |
from reportlab.lib.units import inch, cm |
|
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
11 |
from reportlab.lib.sequencer import Sequencer |
2963 | 12 |
from reportlab.rl_config import defaultPageSize |
13 |
||
14 |
class FrontCoverTemplate(PageTemplate): |
|
15 |
def __init__(self, id, pageSize=defaultPageSize): |
|
16 |
self.pageWidth = pageSize[0] |
|
17 |
self.pageHeight = pageSize[1] |
|
18 |
frame1 = Frame(inch, |
|
19 |
3*inch, |
|
20 |
self.pageWidth - 2*inch, |
|
21 |
self.pageHeight - 518, id='cover') |
|
22 |
PageTemplate.__init__(self, id, [frame1]) # note lack of onPage |
|
23 |
||
24 |
def afterDrawPage(self, canvas, doc): |
|
25 |
canvas.saveState() |
|
26 |
canvas.drawImage('../images/replogo.gif',2*inch, 8*inch) |
|
27 |
||
28 |
||
29 |
canvas.setFont('Times-Roman', 10) |
|
30 |
canvas.line(inch, 120, self.pageWidth - inch, 120) |
|
31 |
||
3602 | 32 |
canvas.drawString(inch, 100, 'Thornton House') |
33 |
canvas.drawString(inch, 88, 'Thornton Road') |
|
3052 | 34 |
canvas.drawString(inch, 76, 'Wimbledon') |
3602 | 35 |
canvas.drawString(inch, 64, 'London SW19 4NG, UK') |
2963 | 36 |
|
37 |
canvas.restoreState() |
|
38 |
||
39 |
||
40 |
class OneColumnTemplate(PageTemplate): |
|
41 |
def __init__(self, id, pageSize=defaultPageSize): |
|
42 |
self.pageWidth = pageSize[0] |
|
43 |
self.pageHeight = pageSize[1] |
|
44 |
frame1 = Frame(inch, |
|
45 |
inch, |
|
46 |
self.pageWidth - 2*inch, |
|
47 |
self.pageHeight - 2*inch, |
|
48 |
id='normal') |
|
49 |
PageTemplate.__init__(self, id, [frame1]) # note lack of onPage |
|
50 |
||
51 |
def afterDrawPage(self, canvas, doc): |
|
52 |
y = self.pageHeight - 50 |
|
53 |
canvas.saveState() |
|
54 |
canvas.setFont('Times-Roman', 10) |
|
55 |
canvas.drawString(inch, y+8, doc.title) |
|
56 |
canvas.drawRightString(self.pageWidth - inch, y+8, doc.chapter) |
|
57 |
canvas.line(inch, y, self.pageWidth - inch, y) |
|
58 |
canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber()) |
|
59 |
canvas.restoreState() |
|
60 |
||
3047 | 61 |
class TOCTemplate(PageTemplate): |
62 |
def __init__(self, id, pageSize=defaultPageSize): |
|
63 |
self.pageWidth = pageSize[0] |
|
64 |
self.pageHeight = pageSize[1] |
|
65 |
frame1 = Frame(inch, |
|
66 |
inch, |
|
67 |
self.pageWidth - 2*inch, |
|
68 |
self.pageHeight - 2*inch, |
|
69 |
id='normal') |
|
70 |
PageTemplate.__init__(self, id, [frame1]) # note lack of onPage |
|
71 |
||
72 |
def afterDrawPage(self, canvas, doc): |
|
73 |
y = self.pageHeight - 50 |
|
74 |
canvas.saveState() |
|
75 |
canvas.setFont('Times-Roman', 10) |
|
76 |
canvas.drawString(inch, y+8, doc.title) |
|
77 |
canvas.drawRightString(self.pageWidth - inch, y+8, 'Table of contents') |
|
78 |
canvas.line(inch, y, self.pageWidth - inch, y) |
|
79 |
canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber()) |
|
80 |
canvas.restoreState() |
|
81 |
||
2963 | 82 |
class TwoColumnTemplate(PageTemplate): |
83 |
def __init__(self, id, pageSize=defaultPageSize): |
|
84 |
self.pageWidth = pageSize[0] |
|
85 |
self.pageHeight = pageSize[1] |
|
86 |
colWidth = 0.5 * (self.pageWidth - 2.25*inch) |
|
87 |
frame1 = Frame(inch, |
|
88 |
inch, |
|
89 |
colWidth, |
|
90 |
self.pageHeight - 2*inch, |
|
91 |
id='leftCol') |
|
92 |
frame2 = Frame(0.5 * self.pageWidth + 0.125, |
|
93 |
inch, |
|
94 |
colWidth, |
|
95 |
self.pageHeight - 2*inch, |
|
96 |
id='rightCol') |
|
97 |
PageTemplate.__init__(self, id, [frame1, frame2]) # note lack of onPage |
|
98 |
||
99 |
def afterDrawPage(self, canvas, doc): |
|
100 |
y = self.pageHeight - 50 |
|
101 |
canvas.saveState() |
|
102 |
canvas.setFont('Times-Roman', 10) |
|
103 |
canvas.drawString(inch, y+8, doc.title) |
|
104 |
canvas.drawRightString(self.pageWidth - inch, y+8, doc.chapter) |
|
105 |
canvas.line(inch, y, self.pageWidth - inch, y*inch) |
|
106 |
canvas.drawCentredString(doc.pagesize[0] / 2, 0.75*inch, 'Page %d' % canvas.getPageNumber()) |
|
107 |
canvas.restoreState() |
|
108 |
||
109 |
||
110 |
class RLDocTemplate(BaseDocTemplate): |
|
111 |
def afterInit(self): |
|
112 |
self.addPageTemplates(FrontCoverTemplate('Cover', self.pagesize)) |
|
3047 | 113 |
self.addPageTemplates(TOCTemplate('TOC', self.pagesize)) |
2963 | 114 |
self.addPageTemplates(OneColumnTemplate('Normal', self.pagesize)) |
115 |
self.addPageTemplates(TwoColumnTemplate('TwoColumn', self.pagesize)) |
|
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
116 |
self.seq = Sequencer() |
2963 | 117 |
|
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
118 |
def beforeDocument(self): |
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
119 |
self.canv.showOutline() |
2963 | 120 |
self.title = "(Document Title Goes Here)" |
121 |
self.chapter = "(No chapter yet)" |
|
3328 | 122 |
self.seq.reset('section') |
123 |
self.seq.reset('chapter') |
|
2963 | 124 |
|
125 |
def afterFlowable(self, flowable): |
|
126 |
"""Detect Level 1 and 2 headings, build outline, |
|
127 |
and track chapter title.""" |
|
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
128 |
|
2963 | 129 |
if isinstance(flowable, Paragraph): |
130 |
style = flowable.style.name |
|
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
131 |
txt = flowable.getPlainText() |
2963 | 132 |
|
133 |
if style == 'Title': |
|
3047 | 134 |
self.title = txt |
2963 | 135 |
elif style == 'Heading1': |
3047 | 136 |
self.chapter = txt |
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
137 |
key = 'ch%s' % self.seq.nextf('chapter') |
2963 | 138 |
self.canv.bookmarkPage(key) |
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
139 |
self.canv.addOutlineEntry(txt, key, 0, 0) |
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
140 |
self.seq.reset("section") |
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
141 |
self.notify('TOCEntry', (0, txt, self.page, key)) |
2963 | 142 |
elif style == 'Heading2': |
143 |
self.section = flowable.text |
|
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
144 |
key = 'ch%ss%s' % (self.seq.thisf("chapter"), self.seq.nextf("section")) |
2963 | 145 |
self.canv.bookmarkPage(key) |
3060
eeedb611fa67
Added feature to have clickable TableOfContents entries (ToDo 978).
jonas
parents:
3052
diff
changeset
|
146 |
self.canv.addOutlineEntry(txt, key, 1, 0) |
3328 | 147 |
self.notify('TOCEntry', (1, txt, self.page, key)) |