Distrotech / reportlab

Mirror of https://bitbucket.org/rptlab/reportlab
Other
61 stars 41 forks source link

temporary FIX: drawToPMCanvas -> dpi ignored #7

Open radjkarl opened 6 years ago

radjkarl commented 6 years ago

Hi there,

when creating a raster image from an SVG with dpi values different then 72, the image range is scaled, but not the image itself.

Version used: 0.8.1

Minimum working example:

` import numpy as np from lxml import etree from svglib.svglib import SvgRenderer from reportlab.graphics import renderPM import pylab as plt

s = ''' <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"

width="100mm" height="100mm" >

<image x="0mm" y="27mm" width="45mm" height="45mm" xlink:href="data:image/jpeg;base64,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"/> <text x="22.5mm" y="50mm" font-family="sans-serif" font-size="4.666666666666667mm" fill="black">aaaaa <text x="77.5mm" y="50mm" font-family="sans-serif" font-size="4.666666666666667mm" fill="black">bbb '''.encode('UTF-8')

parser = etree.XMLParser(remove_comments=True, recover=True) xml = etree.fromstring(s, parser=parser)

for dpi in (72, 150, 300): drw = SvgRenderer('_tempfile.svg').render(xml) pil = renderPM.drawToPIL(drw, dpi=dpi) plt.figure(dpi) plt.imshow(np.array(pil)) plt.show() `

This generated the following output: image

Output after fix: image

I am sure that there is a better way ... such as incorporating d.renderScale (in renderScaledDrawing) right