Exemple #1
0
    def _load_svg(self, value):
        manager = getManager(self.context)

        width = self.context.element.get('width')
        if width is not None:
            width = Measurement().fromUnicode(width)
        height = self.context.element.get('height')
        if height is not None:
            height = Measurement().fromUnicode(height)
        preserve = self.context.element.get('preserveAspectRatio')
        if preserve is not None:
            preserve = Boolean().fromUnicode(preserve)

        cache_key = f'{value}-{width}x{height}-{preserve}'
        if cache_key in manager.svgs:
            return manager.svgs[cache_key]

        from gzip import GzipFile
        from xml.etree import cElementTree

        from reportlab.graphics import renderPM

        from z3c.rml.svg2rlg import Renderer

        fileObj = super().fromUnicode(value)
        svg = fileObj.getvalue()
        if svg[:2] == b'\037\213':
            svg = GzipFile(fileobj=fileObj).read()
        svg = cElementTree.fromstring(svg)
        svg = Renderer(value).render(svg)

        if preserve:
            if width is not None or height is not None:
                if width is not None and height is None:
                    height = svg.height * width / svg.width
                elif height is not None and width is None:
                    width = svg.width * height / svg.height
                elif float(width) / height > float(svg.width) / svg.height:
                    width = svg.width * height / svg.height
                else:
                    height = svg.height * width / svg.width
        else:
            if width is None:
                width = svg.width
            if height is None:
                height = svg.height

        svg.scale(width / svg.width, height / svg.height)
        svg.width = width
        svg.height = height

        svg = renderPM.drawToPIL(svg, dpi=300)
        svg = reportlab.lib.utils.ImageReader(svg)
        # A hack to getImageReader through as an open Image when used with
        # imageAndFlowables
        svg.read = True
        manager.svgs[cache_key] = svg
        return svg
Exemple #2
0
    def _load_svg(self, value):
        manager = getManager(self.context)

        width = self.context.element.get('width')
        if width is not None:
            width = Measurement().fromUnicode(width)
        height = self.context.element.get('height')
        if height is not None:
            height = Measurement().fromUnicode(height)
        preserve = self.context.element.get('preserveAspectRatio')
        if preserve is not None:
            preserve = Boolean().fromUnicode(preserve)

        cache_key = '%s-%sx%s-%s' % (value, width, height, preserve)
        if cache_key in manager.svgs:
            return manager.svgs[cache_key]

        from gzip import GzipFile
        from reportlab.graphics import renderPM
        from xml.etree import cElementTree
        from z3c.rml.svg2rlg import Renderer

        fileObj = super(Image, self).fromUnicode(value)
        svg = fileObj.getvalue()
        if svg[:2] == b'\037\213':
            svg = GzipFile(fileobj=fileObj).read()
        svg = cElementTree.fromstring(svg)
        svg = Renderer(value).render(svg)

        if preserve:
            if width is not None or height is not None:
                if width is not None and height is None:
                    height = svg.height * width / svg.width
                elif height is not None and width is None:
                    width = svg.width * height / svg.height
                elif float(width) / height > float(svg.width) / svg.height:
                    width = svg.width * height / svg.height
                else:
                    height = svg.height * width / svg.width
        else:
            if width is None:
                width = svg.width
            if height is None:
                height = svg.height

        svg.scale(width / svg.width, height / svg.height)
        svg.width = width
        svg.height = height

        svg = renderPM.drawToPIL(svg, dpi=300)
        svg = reportlab.lib.utils.ImageReader(svg)
        svg.read = True # A hack to get ImageReader through as an open Image
                        # when used with imageAndFlowables
        manager.svgs[cache_key] = svg
        return svg