def __init__(self, report_settings, *args, **kwargs): self.settings = report_settings kwargs.update(pagesize=self.settings.page_size.portrait, leftMargin=self.settings.page_size.margin[3], rightMargin=self.settings.page_size.margin[1], topMargin=self.settings.page_size.margin[0], bottomMargin=self.settings.page_size.margin[2]) self.doc = ReportingDocTemplate(*args, **kwargs) self.story = []
def __init__(self, report_settings, *args, **kwargs): self.settings = report_settings kwargs.update( pagesize=self.settings.page_size.portrait, leftMargin=self.settings.page_size.margin[3], rightMargin=self.settings.page_size.margin[1], topMargin=self.settings.page_size.margin[0], bottomMargin=self.settings.page_size.margin[2] ) self.doc = ReportingDocTemplate(*args, **kwargs) self.story = []
def __init__(self, report_settings, *args, **kwargs): self.doc = ReportingDocTemplate(*args, **kwargs) self.settings = report_settings self.story = []
class Report(object): def __init__(self, report_settings, *args, **kwargs): self.doc = ReportingDocTemplate(*args, **kwargs) self.settings = report_settings self.story = [] def init_report(self): self.generate_templates() self.generate_style() def generate_templates(self): frame_kwargs = { # 'showBoundary': 1, # For DEBUG purpose 'leftPadding': 0, 'rightPadding': 0, 'topPadding': 0, 'bottomPadding': 0 } full_frame = Frame(20 * mm, 25 * mm, 170 * mm, 247 * mm, **frame_kwargs) self.doc.addPageTemplates([ PageTemplate(id='Everyone', frames=[full_frame], onPage=self.on_page_cb), ]) def generate_style(self): register_fonts_from_paths( font_name='Bariol', regular=os.path.join(settings.FONTS_DIR, 'bariol_regular-webfont.ttf'), bold=os.path.join(settings.FONTS_DIR, 'bariol_bold-webfont.ttf'), ) self.style = StyleSheet1() self.style.add(ParagraphStyle( name='Normal', fontName=self.settings.font_name, fontSize=self.settings.font_size, textColor=colors.font_color, leading=1.2 * self.settings.font_size ), alias='p') self.style.add(ParagraphStyle( name='BodyText', parent=self.style['Normal'], spaceBefore=6 )) self.style.add(ParagraphStyle( name='Italic', parent=self.style['BodyText'], fontName='%s-Italic' % self.settings.font_name )) self.style.add(ParagraphStyle( name='Heading1', parent=self.style['Normal'], fontName='%s-Bold' % self.settings.font_name, fontSize=1.5 * self.settings.font_size, leading=2 * self.settings.font_size, spaceAfter=6 ), alias='h1') self.style.add(ParagraphStyle( name='Heading2', parent=self.style['Normal'], fontName='%s-Bold' % self.settings.font_name, fontSize=1.25 * self.settings.font_size, leading=1.75 * self.settings.font_size, spaceBefore=12, spaceAfter=6 ), alias='h2') self.style.add(ParagraphStyle( name='Small', parent=self.style['Normal'], fontSize=0.9 * self.settings.font_size, leading=1 * self.settings.font_size, )) self.style.add(ParagraphStyle( name='Smaller', parent=self.style['Normal'], fontSize=0.75 * self.settings.font_size, leading=0.9 * self.settings.font_size, )) self.style.add(BaseTableStyle( name='Table', cmds=[ ('FONTNAME', (0, 0), (-1, -1), self.settings.font_name), ('FONTSIZE', (0, 0), (-1, -1), self.settings.font_size), ('LEADING', (0, 0), (-1, -1), 1.2 * self.settings.font_size), ('TEXTCOLOR', (0, 0), (-1, -1), colors.font_color), ('TOPPADDING', (0, 0), (-1, -1), 4), ('BOTTOMPADDING', (0, 0), (-1, -1), 4), ('VALIGN', (0, 0), (-1, -1), 'TOP'), ] )) self.style.add(BaseTableStyle( name='LayoutTable', parent=self.style['Table'], cmds=[ ('TOPPADDING', (0, 0), (-1, -1), 0), ('LEFTPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ('RIGHTPADDING', (0, 0), (-1, -1), 0), ] )) self.style.add(BaseTableStyle( name='ReportTable', parent=self.style['Table'], cmds=[ ('FONTNAME', (0, 0), (-1, 0), '%s-Bold' % self.settings.font_name), ('FONTSIZE', (0, 0), (-1, 0), 1.1 * self.settings.font_size), ('LEADING', (0, 0), (-1, 0), 1.4 * self.settings.font_size), ('ROWBACKGROUNDS', (0, 1), (-1, -1), (colors.lightergrey, colors.white)), ] )) # For monetary lists self.style.add(ParagraphStyle( name='Monospaced', parent=self.style['Normal'], fontName='Courier', # MUST change to a font closest to the base one )) def on_page_cb(self, canvas, document): # Bending lines canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(colors.darkergrey) canvas.line(0, 195 * mm, 8 * mm, 195 * mm) canvas.line(0, 148.5 * mm, 10 * mm, 148.5 * mm) canvas.line(0, 95 * mm, 8 * mm, 95 * mm) canvas.restoreState() # Page footer canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(colors.green) canvas.line(20 * mm, 18 * mm, 190 * mm, 18 * mm) canvas.restoreState() canvas.saveState() canvas.setFont('%s' % self.settings.font_name, 0.75 * self.settings.font_size) canvas.setFillColor(colors.font_color) canvas.drawRightString(190 * mm, 13 * mm, _("Page %(current)d on %(total)d") % self.doc.page_index()) canvas.restoreState() def on_first_page_cb(self, canvas, document): self.on_page_cb(canvas, document) def on_other_pages_cb(self, canvas, document): self.on_page_cb(canvas, document) def p(self, text, style=None): self.story.append(Paragraph(text, style or self.style['p'])) def h1(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h1'])) def h2(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h2'])) def small(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Small'])) def smaller(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Smaller'])) def spacer(self, height=6 * mm): self.story.append(Spacer(1, height)) def table(self, data, col_widths=None, style=None, **kwargs): self.story.append(Table(data, col_widths, style=style or self.style['Table'], **kwargs)) def hr(self): self.story.append(HRFlowable(width='100%', thickness=0.2, color=base_colors.black)) def hr_mini(self): self.story.append(HRFlowable(width='100%', thickness=0.2, color=base_colors.grey)) def pagebreak(self): self.story.append(PageBreak()) def append(self, data): self.story.append(data) def generate(self): self.doc.multiBuild(self.story) def draw_svg(self, canvas, path, xpos=0, ypos=0, xsize=None, ysize=None): from reportlab.graphics import renderPDF from svglib.svglib import svg2rlg drawing = svg2rlg(path) xL, yL, xH, yH = drawing.getBounds() if xsize: drawing.renderScale = xsize / (xH - xL) if ysize: drawing.renderScale = ysize / (yH - yL) renderPDF.draw(drawing, canvas, xpos, ypos, showBoundary=self.show_boundaries) def next_frame(self): self.story.append(CondPageBreak(20 * cm)) def start_keeptogether(self): self.keeptogether_index = len(self.story) def end_keeptogether(self): keeptogether = KeepTogether(self.story[self.keeptogether_index:]) self.story = self.story[:self.keeptogether_index] self.story.append(keeptogether)
class Report(object): def __init__(self, report_settings, *args, **kwargs): self.settings = report_settings kwargs.update(pagesize=self.settings.page_size.portrait, leftMargin=self.settings.page_size.margin[3], rightMargin=self.settings.page_size.margin[1], topMargin=self.settings.page_size.margin[0], bottomMargin=self.settings.page_size.margin[2]) self.doc = ReportingDocTemplate(*args, **kwargs) self.story = [] def init_report(self): self.generate_templates() self.generate_style() def fill(self): pass def set_metadata(self): pass def generate_templates(self): frame_kwargs = { # 'showBoundary': 1, # For DEBUG purpose 'leftPadding': 0, 'rightPadding': 0, 'topPadding': 0, 'bottomPadding': 0 } full_frame = Frame(self.settings.page_size.margin[3], self.settings.page_size.margin[2], self.settings.page_size.available_width(), self.settings.page_size.available_height(), **frame_kwargs) self.doc.addPageTemplates([ PageTemplate(id='Everyone', frames=[full_frame], onPage=self.on_page_cb), ]) def generate_style(self): self.style = StyleSheet1() self.style.add(ParagraphStyle(name='Normal', fontName=get_font( self.settings.font_name).regular, fontSize=self.settings.font_size, textColor=self.settings.hex_font_color, leading=1.2 * self.settings.font_size), alias='p') self.style.add( ParagraphStyle(name='BodyText', parent=self.style['Normal'], spaceBefore=6)) self.style.add( ParagraphStyle(name='Italic', parent=self.style['BodyText'], fontName=get_font(self.settings.font_name).italic)) self.style.add( ParagraphStyle(name='Bold', parent=self.style['BodyText'], fontName=get_font(self.settings.font_name).bold)) self.style.add(ParagraphStyle(name='Heading1', parent=self.style['Normal'], fontName=get_font( self.settings.font_name).bold, fontSize=1.5 * self.settings.font_size, leading=2 * self.settings.font_size, spaceAfter=6), alias='h1') self.style.add(ParagraphStyle(name='Heading2', parent=self.style['Normal'], fontName=get_font( self.settings.font_name).bold, fontSize=1.25 * self.settings.font_size, leading=1.75 * self.settings.font_size, spaceBefore=12, spaceAfter=6), alias='h2') self.style.add( ParagraphStyle( name='Small', parent=self.style['Normal'], fontSize=0.9 * self.settings.font_size, leading=1 * self.settings.font_size, )) self.style.add( ParagraphStyle( name='Smaller', parent=self.style['Normal'], fontSize=0.75 * self.settings.font_size, leading=0.9 * self.settings.font_size, )) self.style.add( ParagraphStyle(name='PageNumbering', parent=self.style['Smaller'], alignment=TA_RIGHT)) self.style.add( BaseTableStyle(name='Table', cmds=[ ('FONTNAME', (0, 0), (-1, -1), get_font(self.settings.font_name).regular), ('FONTSIZE', (0, 0), (-1, -1), self.settings.font_size), ('LEADING', (0, 0), (-1, -1), 1.2 * self.settings.font_size), ('TEXTCOLOR', (0, 0), (-1, -1), self.settings.hex_font_color), ('TOPPADDING', (0, 0), (-1, -1), 4), ('BOTTOMPADDING', (0, 0), (-1, -1), 4), ('VALIGN', (0, 0), (-1, -1), 'TOP'), ])) self.style.add( BaseTableStyle(name='LayoutTable', parent=self.style['Table'], cmds=[ ('TOPPADDING', (0, 0), (-1, -1), 0), ('LEFTPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ('RIGHTPADDING', (0, 0), (-1, -1), 0), ])) self.style.add( BaseTableStyle( name='ReportTable', parent=self.style['Table'], cmds=[ ('FONTNAME', (0, 0), (-1, 0), get_font(self.settings.font_name).bold), ('FONTSIZE', (0, 0), (-1, 0), 1.1 * self.settings.font_size), ('LEADING', (0, 0), (-1, 0), 1.4 * self.settings.font_size), ('ROWBACKGROUNDS', (0, 1), (-1, -1), (colors.transparent, self.settings.hex_base_color.clone(alpha=0.1))), ])) # For monetary lists self.style.add( ParagraphStyle( name='Monospaced', parent=self.style['Normal'], fontName= 'Courier', # MUST change to a font closest to the base one )) def on_page_cb(self, canvas, document): self.draw_bending_lines(canvas, document) self.header(canvas, document) self.footer(canvas, document) def on_first_page_cb(self, canvas, document): self.on_page_cb(canvas, document) def on_other_pages_cb(self, canvas, document): self.on_page_cb(canvas, document) def draw_bending_lines(self, canvas, document): # Bending lines canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(colors.darkergrey) height = self.settings.page_size.height # 2-part if self.settings.page_size.bending_pos[0]: pos = self.settings.page_size.bending_pos[0][0] canvas.line(0, int(height * pos), 10 * mm, int(height * pos)) # 3-part if self.settings.page_size.bending_pos[1]: for pos in self.settings.page_size.bending_pos[1]: canvas.line(0, int(height * pos), 8 * mm, int(height * pos)) canvas.restoreState() def header(self, canvas, document): pass def footer(self, canvas, document): # Page footer # Line canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(self.settings.hex_base_color) canvas.line(document.leftMargin, document.bottomMargin - 7 * mm, document._rightMargin, document.bottomMargin - 7 * mm) canvas.restoreState() # Page numbering canvas.saveState() numbering = Paragraph(_("Page %(current)d on %(total)d") % self.doc.page_index(), style=self.style['PageNumbering']) available_width, available_height = (25 * mm, document.bottomMargin - 9 * mm) w, h = numbering.wrap(available_width, available_height) numbering.drawOn(canvas, document._rightMargin - w, available_height - h) canvas.restoreState() def p(self, text, style=None): self.story.append(Paragraph(text, style or self.style['p'])) def h1(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h1'])) def h2(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h2'])) def small(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Small'])) def smaller(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Smaller'])) def spacer(self, height=6 * mm): self.story.append(Spacer(1, height)) def table(self, data, col_widths=None, style=None, **kwargs): self.story.append( Table(data, col_widths, style=style or self.style['Table'], **kwargs)) def hr(self): self.story.append( HRFlowable(width='100%', thickness=0.2, color=base_colors.black)) def hr_mini(self): self.story.append( HRFlowable(width='100%', thickness=0.2, color=base_colors.grey)) def pagebreak(self): self.story.append(PageBreak()) def append(self, data): self.story.append(data) def generate(self): self.init_report() self.fill() self.set_metadata() self.doc.multiBuild(self.story) def draw_svg(self, canvas, path, xpos=0, ypos=0, xsize=None, ysize=None): from reportlab.graphics import renderPDF from svglib.svglib import svg2rlg drawing = svg2rlg(path) xL, yL, xH, yH = drawing.getBounds() if xsize: drawing.renderScale = xsize / (xH - xL) if ysize: drawing.renderScale = ysize / (yH - yL) renderPDF.draw(drawing, canvas, xpos, ypos, showBoundary=self.show_boundaries) def next_frame(self): self.story.append(CondPageBreak(20 * cm)) def start_keeptogether(self): self.keeptogether_index = len(self.story) def end_keeptogether(self): keeptogether = KeepTogether(self.story[self.keeptogether_index:]) self.story = self.story[:self.keeptogether_index] self.story.append(keeptogether)
class Report(object): def __init__(self, report_settings, *args, **kwargs): self.settings = report_settings kwargs.update( pagesize=self.settings.page_size.portrait, leftMargin=self.settings.page_size.margin[3], rightMargin=self.settings.page_size.margin[1], topMargin=self.settings.page_size.margin[0], bottomMargin=self.settings.page_size.margin[2] ) self.doc = ReportingDocTemplate(*args, **kwargs) self.story = [] def init_report(self): self.generate_templates() self.generate_style() def fill(self): pass def set_metadata(self): pass def generate_templates(self): frame_kwargs = { # 'showBoundary': 1, # For DEBUG purpose 'leftPadding': 0, 'rightPadding': 0, 'topPadding': 0, 'bottomPadding': 0 } full_frame = Frame( self.settings.page_size.margin[3], self.settings.page_size.margin[2], self.settings.page_size.available_width(), self.settings.page_size.available_height(), **frame_kwargs ) self.doc.addPageTemplates([ PageTemplate(id='Everyone', frames=[full_frame], onPage=self.on_page_cb), ]) def generate_style(self): self.style = StyleSheet1() self.style.add(ParagraphStyle( name='Normal', fontName=get_font(self.settings.font_name).regular, fontSize=self.settings.font_size, textColor=self.settings.hex_font_color, leading=1.2 * self.settings.font_size ), alias='p') self.style.add(ParagraphStyle( name='BodyText', parent=self.style['Normal'], spaceBefore=6 )) self.style.add(ParagraphStyle( name='Italic', parent=self.style['BodyText'], fontName=get_font(self.settings.font_name).italic )) self.style.add(ParagraphStyle( name='Bold', parent=self.style['BodyText'], fontName=get_font(self.settings.font_name).bold )) self.style.add(ParagraphStyle( name='Heading1', parent=self.style['Normal'], fontName=get_font(self.settings.font_name).bold, fontSize=1.5 * self.settings.font_size, leading=2 * self.settings.font_size, spaceAfter=6 ), alias='h1') self.style.add(ParagraphStyle( name='Heading2', parent=self.style['Normal'], fontName=get_font(self.settings.font_name).bold, fontSize=1.25 * self.settings.font_size, leading=1.75 * self.settings.font_size, spaceBefore=12, spaceAfter=6 ), alias='h2') self.style.add(ParagraphStyle( name='Small', parent=self.style['Normal'], fontSize=0.9 * self.settings.font_size, leading=1 * self.settings.font_size, )) self.style.add(ParagraphStyle( name='Smaller', parent=self.style['Normal'], fontSize=0.75 * self.settings.font_size, leading=0.9 * self.settings.font_size, )) self.style.add(ParagraphStyle( name='PageNumbering', parent=self.style['Smaller'], alignment=TA_RIGHT )) self.style.add(BaseTableStyle( name='Table', cmds=[ ('FONTNAME', (0, 0), (-1, -1), get_font(self.settings.font_name).regular), ('FONTSIZE', (0, 0), (-1, -1), self.settings.font_size), ('LEADING', (0, 0), (-1, -1), 1.2 * self.settings.font_size), ('TEXTCOLOR', (0, 0), (-1, -1), self.settings.hex_font_color), ('TOPPADDING', (0, 0), (-1, -1), 4), ('BOTTOMPADDING', (0, 0), (-1, -1), 4), ('VALIGN', (0, 0), (-1, -1), 'TOP'), ] )) self.style.add(BaseTableStyle( name='LayoutTable', parent=self.style['Table'], cmds=[ ('TOPPADDING', (0, 0), (-1, -1), 0), ('LEFTPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ('RIGHTPADDING', (0, 0), (-1, -1), 0), ] )) self.style.add(BaseTableStyle( name='ReportTable', parent=self.style['Table'], cmds=[ ('FONTNAME', (0, 0), (-1, 0), get_font(self.settings.font_name).bold), ('FONTSIZE', (0, 0), (-1, 0), 1.1 * self.settings.font_size), ('LEADING', (0, 0), (-1, 0), 1.4 * self.settings.font_size), ('ROWBACKGROUNDS', (0, 1), (-1, -1), (colors.transparent, self.settings.hex_base_color.clone(alpha=0.1))), ] )) # For monetary lists self.style.add(ParagraphStyle( name='Monospaced', parent=self.style['Normal'], fontName='Courier', # MUST change to a font closest to the base one )) def on_page_cb(self, canvas, document): self.draw_bending_lines(canvas, document) self.header(canvas, document) self.footer(canvas, document) def on_first_page_cb(self, canvas, document): self.on_page_cb(canvas, document) def on_other_pages_cb(self, canvas, document): self.on_page_cb(canvas, document) def draw_bending_lines(self, canvas, document): # Bending lines canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(colors.darkergrey) height = self.settings.page_size.height # 2-part if self.settings.page_size.bending_pos[0]: pos = self.settings.page_size.bending_pos[0][0] canvas.line(0, int(height*pos), 10*mm, int(height*pos)) # 3-part if self.settings.page_size.bending_pos[1]: for pos in self.settings.page_size.bending_pos[1]: canvas.line(0, int(height*pos), 8*mm, int(height*pos)) canvas.restoreState() def header(self, canvas, document): pass def footer(self, canvas, document): # Page footer # Line canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(self.settings.hex_base_color) canvas.line( document.leftMargin, document.bottomMargin - 7*mm, document._rightMargin, document.bottomMargin - 7*mm ) canvas.restoreState() # Page numbering canvas.saveState() numbering = Paragraph(_("Page %(current)d on %(total)d") % self.doc.page_index(), style=self.style['PageNumbering']) available_width, available_height = (25*mm, document.bottomMargin - 9*mm) w, h = numbering.wrap(available_width, available_height) numbering.drawOn(canvas, document._rightMargin - w, available_height - h) canvas.restoreState() def p(self, text, style=None): self.story.append(Paragraph(text, style or self.style['p'])) def h1(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h1'])) def h2(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h2'])) def small(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Small'])) def smaller(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Smaller'])) def spacer(self, height=6 * mm): self.story.append(Spacer(1, height)) def table(self, data, col_widths=None, style=None, **kwargs): self.story.append(Table(data, col_widths, style=style or self.style['Table'], **kwargs)) def hr(self): self.story.append(HRFlowable(width='100%', thickness=0.2, color=base_colors.black)) def hr_mini(self): self.story.append(HRFlowable(width='100%', thickness=0.2, color=base_colors.grey)) def pagebreak(self): self.story.append(PageBreak()) def append(self, data): self.story.append(data) def generate(self): self.init_report() self.fill() self.set_metadata() self.doc.multiBuild(self.story) def draw_svg(self, canvas, path, xpos=0, ypos=0, xsize=None, ysize=None): from reportlab.graphics import renderPDF from svglib.svglib import svg2rlg drawing = svg2rlg(path) xL, yL, xH, yH = drawing.getBounds() if xsize: drawing.renderScale = xsize / (xH - xL) if ysize: drawing.renderScale = ysize / (yH - yL) renderPDF.draw(drawing, canvas, xpos, ypos, showBoundary=self.show_boundaries) def next_frame(self): self.story.append(CondPageBreak(20 * cm)) def start_keeptogether(self): self.keeptogether_index = len(self.story) def end_keeptogether(self): keeptogether = KeepTogether(self.story[self.keeptogether_index:]) self.story = self.story[:self.keeptogether_index] self.story.append(keeptogether)
class Report(object): def __init__(self, report_settings, *args, **kwargs): self.doc = ReportingDocTemplate(*args, **kwargs) self.settings = report_settings self.story = [] def init_report(self): self.generate_templates() self.generate_style() def generate_templates(self): frame_kwargs = { # 'showBoundary': 1, # For DEBUG purpose 'leftPadding': 0, 'rightPadding': 0, 'topPadding': 0, 'bottomPadding': 0 } full_frame = Frame(20 * mm, 25 * mm, 170 * mm, 247 * mm, **frame_kwargs) self.doc.addPageTemplates([ PageTemplate(id='Everyone', frames=[full_frame], onPage=self.on_page_cb), ]) def generate_style(self): register_fonts_from_paths( font_name='Bariol', regular=os.path.join(settings.FONTS_DIR, 'bariol_regular-webfont.ttf'), bold=os.path.join(settings.FONTS_DIR, 'bariol_bold-webfont.ttf'), ) self.style = StyleSheet1() self.style.add(ParagraphStyle(name='Normal', fontName=self.settings.font_name, fontSize=self.settings.font_size, textColor=colors.font_color, leading=1.2 * self.settings.font_size), alias='p') self.style.add( ParagraphStyle(name='BodyText', parent=self.style['Normal'], spaceBefore=6)) self.style.add( ParagraphStyle(name='Italic', parent=self.style['BodyText'], fontName='%s-Italic' % self.settings.font_name)) self.style.add(ParagraphStyle(name='Heading1', parent=self.style['Normal'], fontName='%s-Bold' % self.settings.font_name, fontSize=1.5 * self.settings.font_size, leading=2 * self.settings.font_size, spaceAfter=6), alias='h1') self.style.add(ParagraphStyle(name='Heading2', parent=self.style['Normal'], fontName='%s-Bold' % self.settings.font_name, fontSize=1.25 * self.settings.font_size, leading=1.75 * self.settings.font_size, spaceBefore=12, spaceAfter=6), alias='h2') self.style.add( ParagraphStyle( name='Small', parent=self.style['Normal'], fontSize=0.9 * self.settings.font_size, leading=1 * self.settings.font_size, )) self.style.add( ParagraphStyle( name='Smaller', parent=self.style['Normal'], fontSize=0.75 * self.settings.font_size, leading=0.9 * self.settings.font_size, )) self.style.add( BaseTableStyle( name='Table', cmds=[ ('FONTNAME', (0, 0), (-1, -1), self.settings.font_name), ('FONTSIZE', (0, 0), (-1, -1), self.settings.font_size), ('LEADING', (0, 0), (-1, -1), 1.2 * self.settings.font_size), ('TEXTCOLOR', (0, 0), (-1, -1), colors.font_color), ('TOPPADDING', (0, 0), (-1, -1), 4), ('BOTTOMPADDING', (0, 0), (-1, -1), 4), ('VALIGN', (0, 0), (-1, -1), 'TOP'), ])) self.style.add( BaseTableStyle(name='LayoutTable', parent=self.style['Table'], cmds=[ ('TOPPADDING', (0, 0), (-1, -1), 0), ('LEFTPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ('RIGHTPADDING', (0, 0), (-1, -1), 0), ])) self.style.add( BaseTableStyle(name='ReportTable', parent=self.style['Table'], cmds=[ ('FONTNAME', (0, 0), (-1, 0), '%s-Bold' % self.settings.font_name), ('FONTSIZE', (0, 0), (-1, 0), 1.1 * self.settings.font_size), ('LEADING', (0, 0), (-1, 0), 1.4 * self.settings.font_size), ('ROWBACKGROUNDS', (0, 1), (-1, -1), (colors.lightergrey, colors.white)), ])) # For monetary lists self.style.add( ParagraphStyle( name='Monospaced', parent=self.style['Normal'], fontName= 'Courier', # MUST change to a font closest to the base one )) def on_page_cb(self, canvas, document): # Bending lines canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(colors.darkergrey) canvas.line(0, 195 * mm, 8 * mm, 195 * mm) canvas.line(0, 148.5 * mm, 10 * mm, 148.5 * mm) canvas.line(0, 95 * mm, 8 * mm, 95 * mm) canvas.restoreState() # Page footer canvas.saveState() canvas.setLineWidth(0.2) canvas.setLineCap(1) canvas.setStrokeColor(colors.green) canvas.line(20 * mm, 18 * mm, 190 * mm, 18 * mm) canvas.restoreState() canvas.saveState() canvas.setFont('%s' % self.settings.font_name, 0.75 * self.settings.font_size) canvas.setFillColor(colors.font_color) canvas.drawRightString( 190 * mm, 13 * mm, _("Page %(current)d on %(total)d") % self.doc.page_index()) canvas.restoreState() def on_first_page_cb(self, canvas, document): self.on_page_cb(canvas, document) def on_other_pages_cb(self, canvas, document): self.on_page_cb(canvas, document) def p(self, text, style=None): self.story.append(Paragraph(text, style or self.style['p'])) def h1(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h1'])) def h2(self, text, style=None): self.story.append(Paragraph(text, style or self.style['h2'])) def small(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Small'])) def smaller(self, text, style=None): self.story.append(Paragraph(text, style or self.style['Smaller'])) def spacer(self, height=6 * mm): self.story.append(Spacer(1, height)) def table(self, data, col_widths=None, style=None, **kwargs): self.story.append( Table(data, col_widths, style=style or self.style['Table'], **kwargs)) def hr(self): self.story.append( HRFlowable(width='100%', thickness=0.2, color=base_colors.black)) def hr_mini(self): self.story.append( HRFlowable(width='100%', thickness=0.2, color=base_colors.grey)) def pagebreak(self): self.story.append(PageBreak()) def append(self, data): self.story.append(data) def generate(self): self.doc.multiBuild(self.story) def draw_svg(self, canvas, path, xpos=0, ypos=0, xsize=None, ysize=None): from reportlab.graphics import renderPDF from svglib.svglib import svg2rlg drawing = svg2rlg(path) xL, yL, xH, yH = drawing.getBounds() if xsize: drawing.renderScale = xsize / (xH - xL) if ysize: drawing.renderScale = ysize / (yH - yL) renderPDF.draw(drawing, canvas, xpos, ypos, showBoundary=self.show_boundaries) def next_frame(self): self.story.append(CondPageBreak(20 * cm)) def start_keeptogether(self): self.keeptogether_index = len(self.story) def end_keeptogether(self): keeptogether = KeepTogether(self.story[self.keeptogether_index:]) self.story = self.story[:self.keeptogether_index] self.story.append(keeptogether)