diff --git a/qrcode/image/svg.py b/qrcode/image/svg.py index bf4bbc3b..c776d4dc 100644 --- a/qrcode/image/svg.py +++ b/qrcode/image/svg.py @@ -45,7 +45,8 @@ def new_image(self, **kwargs): def _svg(self, tag=ET.QName(_SVG_namespace, "svg")): dimension = self.mm(self.pixel_size) return ET.Element( - tag, version="1.1", width=dimension, height=dimension) + tag, version="1.1", width=dimension, height=dimension, + viewbox='0 0 %(d)s %(d)s' % {'d': dimension}) def _rect(self, row, col, tag=ET.QName(_SVG_namespace, "rect")): x, y = self.pixel_box(row, col)[0] @@ -77,32 +78,18 @@ def _write(self, stream): xml_declaration=True) -class SvgPathImage(SvgFragmentImage): +class SvgPathImage(SvgImage): """ SVG image builder with one single element (removes white spaces - between individual QR points)""" + between individual QR points). + """ - SCALE = 1 - UNITS = 'mm' QR_PATH_STYLE = 'fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none' def __init__(self, border, width, box_size): self._points = set() super(SvgPathImage, self).__init__(border, width, box_size) - def _svg(self, tag=ET.QName("svg")): - dimension = self.width * self.SCALE + (2 * self.border * self.SCALE) - - svg = ET.Element( - tag, - version="1.1", - width="{0}{units}".format(dimension, units=self.UNITS), - height="{0}{units}".format(dimension, units=self.UNITS), - viewBox="0 0 {s} {s}".format(s=dimension) - ) - svg.set("xmlns", self._SVG_namespace) - return svg - def drawrect(self, row, col): # (x, y) self._points.add((col, row)) @@ -110,18 +97,20 @@ def drawrect(self, row, col): def _generate_subpaths(self): """Generates individual QR points as subpaths""" - scale = self.SCALE + rect_size = self.mm(self.box_size, text=False) for point in self._points: - x_base = point[0] * scale + self.border * scale - y_base = point[1] * scale + self.border * scale - - yield 'M {x0} {y0} L {x0} {y1} L {x1} {y1} L {x1} {y0} z'.format( - x0=x_base, - y0=y_base, - x1=x_base + scale, - y1=y_base + scale - ) + x_base = self.mm((point[0]+self.border)*self.box_size*3, text=False) + y_base = self.mm((point[1]+self.border)*self.box_size*3, text=False) + + yield ( + 'M %(x0)s %(y0)s L %(x0)s %(y1)s L %(x1)s %(y1)s L %(x1)s ' + '%(y0)s z' % dict( + x0=x_base, + y0=y_base, + x1=x_base + rect_size, + y1=y_base + rect_size, + )) def make_path(self): subpaths = self._generate_subpaths() @@ -135,5 +124,4 @@ def make_path(self): def _write(self, stream): self._img.append(self.make_path()) - ET.ElementTree(self._img).write(stream, - encoding="UTF-8", xml_declaration=True) + super(SvgPathImage, self)._write(stream) diff --git a/qrcode/tests.py b/qrcode/tests.py index c9bfcfe0..6e2557ee 100644 --- a/qrcode/tests.py +++ b/qrcode/tests.py @@ -71,6 +71,11 @@ def test_render_svg(self): qr.add_data(UNICODE_TEXT) qr.make_image(image_factory=qrcode.image.svg.SvgImage) + def test_render_svg_path(self): + qr = qrcode.QRCode() + qr.add_data(UNICODE_TEXT) + qr.make_image(image_factory=qrcode.image.svg.SvgPathImage) + @unittest.skipIf(ANCIENT_PYTHON, "Only Python 2.6 and greater") def test_render_pymaging_png(self): qr = qrcode.QRCode()