71ac7a1cdb
(Note: New dependency! Run 'pip install qrcode') Fixed pep8 issues. Create qr-code image for system url one time only. New feature: qr-code for system url on participants password pdf. (Note: New dependency! Run 'pip install qrcode') Fixed pep8 issues. Create qr-code image for system url one time only. Print qrcode image from StringIO stream. Adapted table stylesheet for better integration of reportlab's Image object. Fixed pep8 issue. Made qrcode import as optional feature. Fixed pep8 issue.
257 lines
7.8 KiB
Python
Executable File
257 lines
7.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
openslides.utils.pdf
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Additional definitions for creating PDF documents.
|
|
|
|
:copyright: 2011, 2012 by OpenSlides team, see AUTHORS.
|
|
:license: GNU GPL, see LICENSE for more details.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from os.path import join as path_join
|
|
|
|
from reportlab.lib.styles import StyleSheet1, ParagraphStyle
|
|
from reportlab.lib.units import cm
|
|
from reportlab.pdfbase import pdfmetrics
|
|
from reportlab.pdfbase.ttfonts import TTFont
|
|
from reportlab.rl_config import defaultPageSize
|
|
|
|
from django.conf import settings
|
|
from django.utils import formats
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from openslides.config.models import config
|
|
|
|
|
|
# register new truetype fonts
|
|
pdfmetrics.registerFont(TTFont(
|
|
'Ubuntu', path_join(settings.SITE_ROOT, 'static/fonts/Ubuntu-R.ttf')))
|
|
pdfmetrics.registerFont(TTFont(
|
|
'Ubuntu-Bold', path_join(settings.SITE_ROOT, 'static/fonts/Ubuntu-B.ttf')))
|
|
pdfmetrics.registerFont(TTFont(
|
|
'Ubuntu-Italic', path_join(settings.SITE_ROOT, 'static/fonts/Ubuntu-RI.ttf')))
|
|
|
|
|
|
# set style information
|
|
PAGE_HEIGHT = defaultPageSize[1]
|
|
PAGE_WIDTH = defaultPageSize[0]
|
|
|
|
|
|
# set custom stylesheets
|
|
stylesheet = StyleSheet1()
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Normal',
|
|
fontName='Ubuntu',
|
|
fontSize=10,
|
|
leading=12,
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Paragraph',
|
|
parent=stylesheet['Normal'],
|
|
leading=14,
|
|
spaceAfter=15
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Small',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=8
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Italic',
|
|
parent=stylesheet['Normal'],
|
|
fontName='Ubuntu-Italic',
|
|
spaceAfter=5
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Bold',
|
|
parent=stylesheet['Normal'],
|
|
fontName='Ubuntu-Bold',
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Heading1',
|
|
parent=stylesheet['Bold'],
|
|
fontSize=24,
|
|
leading=30,
|
|
spaceAfter=6,
|
|
), alias='h1')
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Heading2',
|
|
parent=stylesheet['Bold'],
|
|
fontSize=14,
|
|
leading=24,
|
|
spaceAfter=10,
|
|
), alias='h2')
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Heading3',
|
|
parent=stylesheet['Bold'],
|
|
fontSize=12,
|
|
leading=20,
|
|
), alias='h3')
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Heading4',
|
|
parent=stylesheet['Bold'],
|
|
fontSize=10,
|
|
leading=20,
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Item',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=14,
|
|
leading=14,
|
|
leftIndent=0,
|
|
spaceAfter=15,
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Subitem',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=10,
|
|
leading=10,
|
|
leftIndent=20,
|
|
spaceAfter=15))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Tablecell',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=9))
|
|
stylesheet.add(ParagraphStyle(name='Signaturefield',
|
|
parent=stylesheet['Normal'],
|
|
spaceBefore=15)
|
|
)
|
|
|
|
# Ballot stylesheets
|
|
stylesheet.add(ParagraphStyle(name='Ballot_title',
|
|
parent=stylesheet['Bold'],
|
|
fontSize=12,
|
|
leading=14,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_subtitle',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=10,
|
|
leading=12,
|
|
leftIndent=30,
|
|
rightIndent=20,
|
|
spaceAfter=5),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_description',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=7,
|
|
leading=10,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_option',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=12,
|
|
leading=24,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_option_name',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=12,
|
|
leading=15,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_option_group',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=8,
|
|
leading=15,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_option_YNA',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=12,
|
|
leading=15,
|
|
leftIndent=49,
|
|
spaceAfter=18),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Ballot_option_group_right',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=8,
|
|
leading=16,
|
|
leftIndent=49),
|
|
)
|
|
# Password paper stylesheets
|
|
stylesheet.add(ParagraphStyle(name='Password_title',
|
|
parent=stylesheet['Ballot_title'],
|
|
leftIndent=0),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Password_subtitle',
|
|
parent=stylesheet['Ballot_subtitle'],
|
|
leftIndent=0),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Monotype',
|
|
parent=stylesheet['Normal'],
|
|
fontName='Courier',
|
|
fontSize=12,
|
|
leading=24,
|
|
leftIndent=0),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Badge_title',
|
|
parent=stylesheet['Bold'],
|
|
fontSize=16,
|
|
leading=22,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(name='Badge_subtitle',
|
|
parent=stylesheet['Normal'],
|
|
fontSize=12,
|
|
leading=24,
|
|
leftIndent=30),
|
|
)
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Badge_italic',
|
|
parent=stylesheet['Italic'],
|
|
fontSize=12,
|
|
leading=24,
|
|
leftIndent=30,
|
|
))
|
|
stylesheet.add(ParagraphStyle(
|
|
name='Badge_qrcode',
|
|
fontSize=12,
|
|
leftIndent=190,
|
|
))
|
|
|
|
|
|
def firstPage(canvas, doc):
|
|
canvas.saveState()
|
|
# page header (with event information)
|
|
canvas.setFont('Ubuntu', 10)
|
|
canvas.setFillGray(0.4)
|
|
|
|
title_line = u"%s | %s" % (config["event_name"],
|
|
config["event_description"])
|
|
if len(title_line) > 75:
|
|
title_line = "%s ..." % title_line[:70]
|
|
canvas.drawString(2.75 * cm, 28 * cm, title_line)
|
|
if config["event_date"] and config["event_location"]:
|
|
canvas.drawString(2.75 * cm, 27.6 * cm, u"%s, %s"
|
|
% (config["event_date"], config["event_location"]))
|
|
|
|
# time
|
|
canvas.setFont('Ubuntu', 7)
|
|
time = formats.date_format(datetime.now(), 'DATETIME_FORMAT')
|
|
canvas.drawString(15 * cm, 28 * cm, _("As of: %s") % time)
|
|
|
|
# title
|
|
if doc.title:
|
|
canvas.setFont('Ubuntu-Bold', 24)
|
|
canvas.setFillGray(0)
|
|
canvas.drawString(2.75 * cm, PAGE_HEIGHT - 108, doc.title)
|
|
|
|
# footer (with page number)
|
|
canvas.setFont('Ubuntu', 8)
|
|
canvas.setFillGray(0.4)
|
|
canvas.drawString(10 * cm, 1 * cm, _("Page %s") % doc.page)
|
|
canvas.restoreState()
|
|
|
|
|
|
def laterPages(canvas, doc):
|
|
canvas.saveState()
|
|
# footer (with page number)
|
|
canvas.setFont('Ubuntu', 7)
|
|
canvas.setFillGray(0.4)
|
|
canvas.drawString(10 * cm, 1 * cm, _("Page %s") % doc.page)
|
|
canvas.restoreState()
|