def update_paragraph_style(default_style: ParagraphStyle, bnml_style: Dict[str, Any]): """Replaces ReportLab ParagraphStyle attributes with Kassia bnml attributes. :param default_style: The default ParagraphStyle (a ReportLab class). :param bnml_style: A dictionary of styles read a Kassia bnml file. The bnml_style needs to have ben already run through fill_dict_attributes(). """ if 'font_family' in bnml_style and font_reader.is_registered_font( bnml_style['font_family']): default_style.fontName = bnml_style['font_family'] if 'font_size' in bnml_style: default_style.fontSize = bnml_style['font_size'] if 'color' in bnml_style: default_style.textColor = bnml_style['color'] if 'bgcolor' in bnml_style: default_style.backColor = bnml_style['bgcolor'] if 'align' in bnml_style: default_style.alignment = bnml_style['align'] if 'first_line_indent' in bnml_style: default_style.firstLineIndent = bnml_style['first_line_indent'] if 'auto_leading' in bnml_style: default_style.autoLeading = bnml_style['auto_leading'] if 'leading' in bnml_style: default_style.leading = bnml_style['leading'] if 'left_indent' in bnml_style: default_style.leftIndent = bnml_style['left_indent'] if 'right_indent' in bnml_style: default_style.rightIndent = bnml_style['right_indent'] if 'space_before' in bnml_style: default_style.spaceBefore = bnml_style['space_before'] if 'space_after' in bnml_style: default_style.spaceAfter = bnml_style['space_after'] if 'word_spacing' in bnml_style: default_style.wordSpace = bnml_style['word_spacing'] if 'border_width' in bnml_style: default_style.borderWidth = bnml_style['border_width'] if 'border_color' in bnml_style: default_style.borderColor = bnml_style['border_color'] return default_style
def draw_paragraph(self, current_paragraph_attrib): self.vert_pos -= (current_paragraph_attrib['font_size'] + current_paragraph_attrib['top_margin']) if not self.is_space_for_another_line(self.vert_pos): self.draw_newpage() self.vert_pos -= current_paragraph_attrib[ 'font_size'] + current_paragraph_attrib['top_margin'] self.canvas.setFillColor(current_paragraph_attrib['color']) self.canvas.setFont(current_paragraph_attrib['font_family'], current_paragraph_attrib['font_size']) paragraph_style = ParagraphStyle('test') paragraph_style.fontName = current_paragraph_attrib['font_family'] paragraph_style.fontSize = current_paragraph_attrib['font_size'] paragraph_style.textColor = current_paragraph_attrib['color'] paragraph_style.firstLineIndent = current_paragraph_attrib[ 'first_line_indent'] paragraph_style.autoLeading = current_paragraph_attrib['auto_leading'] paragraph_style.leftIndent = current_paragraph_attrib['left_indent'] paragraph_style.rightIndent = current_paragraph_attrib['right_indent'] if current_paragraph_attrib['align'] == 'left': paragraph_style.alignment = TA_LEFT elif current_paragraph_attrib['align'] == 'right': paragraph_style.alignment = TA_RIGHT else: paragraph_style.alignment = TA_CENTER paragraph = Paragraph(current_paragraph_attrib['text'], paragraph_style) # returns size actually used w, h = paragraph.wrap(self.pageAttrib['line_width'], self.pageAttrib['bottom_margin']) self.vert_pos -= (h + current_paragraph_attrib['bottom_margin']) # self.canvas.saveState() paragraph.drawOn(self.canvas, self.pageAttrib['left_margin'], self.vert_pos)
def testAutoLeading(self): from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame, PageBegin from reportlab.lib.units import inch from reportlab.platypus.flowables import AnchorFlowable class MyDocTemplate(BaseDocTemplate): _invalidInitArgs = ('pageTemplates',) def __init__(self, filename, **kw): self.allowSplitting = 0 kw['showBoundary']=1 BaseDocTemplate.__init__(self, filename, **kw) self.addPageTemplates( [ PageTemplate('normal', [Frame(inch, inch, 6.27*inch, 9.69*inch, id='first',topPadding=0,rightPadding=0,leftPadding=0,bottomPadding=0,showBoundary=ShowBoundaryValue(color="red"))], ), ]) from reportlab.lib.testutils import testsFolder styleSheet = getSampleStyleSheet() normal = ParagraphStyle(name='normal',fontName='Times-Roman',fontSize=12,leading=1.2*12,parent=styleSheet['Normal']) normal_sp = ParagraphStyle(name='normal_sp',parent=normal,alignment=TA_JUSTIFY,spaceBefore=12) texts = ['''Furthermore, a subset of <font size="14">English sentences</font> interesting on quite independent grounds is not quite equivalent to a stipulation to place <font color="blue">the constructions <img src="%(testsFolder)s/../docs/images/testimg.gif"/> into these various categories.</font>'''%dict(testsFolder=testsFolder), '''We will bring <font size="18">Ugly Things</font> in favor of The following thesis: most of the methodological work in Modern Linguistics can be <img src="%(testsFolder)s/../docs/images/testimg.gif" valign="baseline" /> defined in such <img src="%(testsFolder)s/../docs/images/testimg.gif" valign="10" /> a way as to impose problems of phonemic and <u>morphological <img src="%(testsFolder)s/../docs/images/testimg.gif" valign="top"/> </u> analysis.'''%dict(testsFolder=testsFolder)] story =[] a = story.append t = 'u' n = 1 for s in (normal,normal_sp): for autoLeading in ('','min','max'): a(Paragraph('style=%s(autoLeading=%s)'%(s.name,autoLeading),style=normal_sp)) a(Paragraph('<para autoleading="%s"><%s>%s</%s>. %s <%s>%s</%s>. %s</para>' % ( autoLeading, t,' '.join((n+1)*['A']),t,texts[0],t,' '.join((n+1)*['A']),t,texts[1]), style=s)) a(Paragraph('''<img src="%(testsFolder)s/../docs/images/testimg.gif" valign="top"/> image is very first thing in the line.'''%dict(testsFolder=testsFolder), style=normal)) a(Paragraph('some text.... some more.... some text.... some more....', normal)) a(Paragraph('<img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="0.19in" /> some text <br /> '%dict(testsFolder=testsFolder), normal)) a(Paragraph('some text.... some more.... some text.... some more....', normal)) a(Paragraph('<img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="0.19in" /> <br /> '%dict(testsFolder=testsFolder), normal)) a(Paragraph('some text.... some more.... some text.... some more....', normal)) #Volker Haas' valign tests fmt = '''<font color="red">%(valign)s</font>: Furthermore, a <u>subset</u> <strike>of</strike> <font size="14">English sentences</font> interesting on quite independent grounds is not quite equivalent to a stipulation to place <img src="%(testsFolder)s/../docs/images/redsquare.png" width="0.5in" height="0.5in" valign="%(valign)s"/> the constructions into these <u>various</u> categories. We will bring <font size="18">Ugly Things</font> in favor of The following thesis: most of the methodological work in Modern Linguistics can be defined in such a way as to impose problems of phonemic and <u>morphological</u> <strike>analysis</strike>.''' p_style= ParagraphStyle('Normal') p_style.autoLeading = 'max' for valign in ( 'baseline', 'sub', 'super', 'top', 'text-top', 'middle', 'bottom', 'text-bottom', '0%', '2in', ): a(Paragraph(fmt % dict(valign=valign,testsFolder=testsFolder),p_style)) a(XPreformatted(fmt % dict(valign=valign,testsFolder=testsFolder),p_style)) a(Paragraph('<br/><b>Some Paragraph tests of <img width="x%" height="x%"</b>...', normal)) a(Paragraph('H=10%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="10%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('H=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="50%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('H=100%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="100%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('H=100%% W=10%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="10%%" height="100%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('H=100%% W=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="50%%" height="100%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('H=50%% W=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="50%%" height="50%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('<br/><b>Some XPreformatted tests of <img width="x%" height="x%"</b>...', normal)) a(XPreformatted('H=10%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="10%%" />'%dict(testsFolder=testsFolder), normal)) a(XPreformatted('H=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="50%%" />'%dict(testsFolder=testsFolder), normal)) a(XPreformatted('H=100%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="100%%" />'%dict(testsFolder=testsFolder), normal)) a(XPreformatted('H=100%% W=10%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="10%%" height="100%%" />'%dict(testsFolder=testsFolder), normal)) a(XPreformatted('H=100%% W=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="50%%" height="100%%" />'%dict(testsFolder=testsFolder), normal)) a(XPreformatted('H=50%% W=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="50%%" height="50%%" />'%dict(testsFolder=testsFolder), normal)) a(Paragraph('<br/><b>Some CJK Paragraph tests of <img width="x%" height="x%"</b>...', normal)) normalCJK = ParagraphStyle('normalCJK', parent=normal, wordWrap = 'CJK') a(Paragraph('H=10%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="10%%" />'%dict(testsFolder=testsFolder), normalCJK)) a(Paragraph('H=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="50%%" />'%dict(testsFolder=testsFolder), normalCJK)) a(Paragraph('H=100%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="0.57in" height="100%%" />'%dict(testsFolder=testsFolder), normalCJK)) a(Paragraph('H=100%% W=10%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="10%%" height="100%%" />'%dict(testsFolder=testsFolder), normalCJK)) a(Paragraph('H=100%% W=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="50%%" height="100%%" />'%dict(testsFolder=testsFolder), normalCJK)) a(Paragraph('H=50%% W=50%% <img src="%(testsFolder)s/../docs/images/testimg.gif" width="50%%" height="50%%" />'%dict(testsFolder=testsFolder), normalCJK)) doc = MyDocTemplate(outputfile('test_platypus_paragraphs_autoleading.pdf')) doc.build(story)
def computeSize(self): # the thing will draw in its own coordinate system ddfKlass = getattr(self,'ddfKlass',None) if not ddfKlass: self._lineWidths = [] self._lines = simpleSplit(self._text,self.fontName,self.fontSize,self.maxWidth) if not self.width: self._width = self.leftPadding+self.rightPadding if self._lines: self._lineWidths = [stringWidth(line,self.fontName,self.fontSize) for line in self._lines] self._width += max(self._lineWidths) else: self._width = self.width self._getBaseLineRatio() if self.leading: self._leading = self.leading elif self.useAscentDescent: self._leading = self._ascent - self._descent else: self._leading = self.fontSize*1.2 objH = self._leading*len(self._lines) else: if self.ddf is None: raise RuntimeError('DirectDrawFlowable class is not available you need the rlextra package as well as reportlab') sty = dict( name='xlabel-generated', fontName=self.fontName, fontSize=self.fontSize, fillColor=self.fillColor, strokeColor=self.strokeColor, ) if not self.ddfStyle: sty = ParagraphStyle(**sty) elif issubclass(self.ddfStyle,PropertySet): sty = self.ddfStyle(**sty) else: sty = self.ddfStyle.clone() self._style = sty self._getBaseLineRatio() if self.useAscentDescent: sty.autoLeading = True sty.leading = self._ascent - self._descent else: sty.leading = self.leading if self.leading else self.fontSize*1.2 self._leading = sty.leading ta = self._getTextAnchor() aW = self.maxWidth or 0x7fffffff if ta!='start': sty.alignment = TA_LEFT obj = ddfKlass(self._text,style=sty) _, objH = obj.wrap(aW,0x7fffffff) aW = self.maxWidth or obj._width_max sty.alignment = _ta2al[ta] self._ddfObj = obj = ddfKlass(self._text,style=sty) _, objH = obj.wrap(aW,0x7fffffff) if not self.width: self._width = self.leftPadding+self.rightPadding self._width += obj._width_max else: self._width = self.width self._computeSizeEnd(objH)