OpenSlides/openslides/utils/pdf.py

274 lines
8.4 KiB
Python

from datetime import datetime
from os.path import join as path_join
from django.conf import settings
from django.utils import formats
from django.utils.translation import ugettext as _
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle, StyleSheet1
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.rl_config import defaultPageSize
from openslides.core.config import config
# register new truetype fonts
pdfmetrics.registerFont(TTFont(
'Ubuntu', path_join(settings.SITE_ROOT, 'core/static/fonts/Ubuntu-R.ttf')))
pdfmetrics.registerFont(TTFont(
'Ubuntu-Bold', path_join(settings.SITE_ROOT, 'core/static/fonts/Ubuntu-B.ttf')))
pdfmetrics.registerFont(TTFont(
'Ubuntu-Italic', path_join(settings.SITE_ROOT, 'core/static/fonts/Ubuntu-RI.ttf')))
pdfmetrics.registerFont(TTFont(
'circlefont', path_join(settings.SITE_ROOT, 'core/static/fonts/circle.ttf')))
pdfmetrics.registerFontFamily('Ubuntu', normal='Ubuntu', bold='Ubuntu-Bold', italic='Ubuntu-Italic')
# 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='Paragraph12',
parent=stylesheet['Paragraph'],
fontSize=12
))
stylesheet.add(ParagraphStyle(
name='InnerParagraph',
parent=stylesheet['Normal'],
leading=14,
spaceBefore=5,
spaceAfter=5,
bulletIndent=-15,
bulletFontSize=8,
bulletColor=colors.grey
))
stylesheet.add(ParagraphStyle(
name='InnerListParagraph',
parent=stylesheet['InnerParagraph'],
bulletIndent=10,
bulletFontSize=10,
bulletColor=colors.black,
leftIndent=30
))
stylesheet.add(ParagraphStyle(
name='InnerMonotypeParagraph',
parent=stylesheet['InnerParagraph'],
fontName='Courier',
))
stylesheet.add(ParagraphStyle(
name='InnerH1Paragraph',
parent=stylesheet['InnerParagraph'],
fontName='Ubuntu-Bold',
fontSize=16,
spaceBefore=20,
spaceAfter=10,
))
stylesheet.add(ParagraphStyle(
name='InnerH2Paragraph',
parent=stylesheet['InnerH1Paragraph'],
fontSize=12,
spaceBefore=20,
spaceAfter=10,
))
stylesheet.add(ParagraphStyle(
name='InnerH3Paragraph',
parent=stylesheet['InnerH2Paragraph'],
fontSize=10,
spaceBefore=15,
spaceAfter=5,
))
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,
), alias='h4')
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_YNA',
parent=stylesheet['Ballot_option'],
leading=14),
)
stylesheet.add(ParagraphStyle(name='Ballot_option_name',
parent=stylesheet['Ballot_option_name_YNA'],
leading=17),
)
stylesheet.add(ParagraphStyle(name='Ballot_option_suffix_YNA',
parent=stylesheet['Ballot_option_name_YNA'],
fontSize=8,
leading=11),
)
stylesheet.add(ParagraphStyle(name='Ballot_option_suffix',
parent=stylesheet['Ballot_option_suffix_YNA'],
leading=16,
leftIndent=48),
)
stylesheet.add(ParagraphStyle(name='Ballot_option_circle_YNA',
parent=stylesheet['Ballot_option_name_YNA'],
leftIndent=48,
spaceAfter=18),
)
# Password paper stylesheets
stylesheet.add(ParagraphStyle(name='formfield',
parent=stylesheet['Normal'],
fontSize=12,
leading=18,
leftIndent=0),
)
stylesheet.add(ParagraphStyle(name='formfield_value',
parent=stylesheet['Normal'],
fontName='Courier',
fontSize=12,
leading=28,
leftIndent=10),
)
stylesheet.add(ParagraphStyle(name='qrcode_comment',
parent=stylesheet['Small'],
spaceBefore=6),
)
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["general_event_name"],
config["general_event_description"])
if len(title_line) > 75:
title_line = "%s ..." % title_line[:70]
canvas.drawString(2.75 * cm, 28 * cm, title_line)
if config["general_event_date"] and config["general_event_location"]:
canvas.drawString(2.75 * cm, 27.6 * cm, u"%s, %s"
% (config["general_event_date"], config["general_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()