Search code examples
node.jssvgpromisestreampdfmake

Streaming multiple svg strings to png in nodejs using promises


I am trying to convert multiple svg strings to png's so I can render them onto a pdf using PdfMake in nodejs. This works fine for one svg, but when I add multiple svg strings, they get overwritten by the last one. With this example code, it renders two images of png2 (svg2).

const promises = [svg1,svg2].map(str => {
    const stream = new Readable();
    stream.push(str);
    stream.push(null);
    return svgPromise(stream);
});

const result = await Promise.all(promises);

const png1 = result[0].content;
const png2 = result[1].content;

function svgPromise(stream) {
    return new Promise((resolve, reject) => {
    const svg = new Rsvg();
    stream.pipe(svg);
    svg.on("finish", function() {
      const buffer = svg.render({
          format: "png",
          width: width * 2,
          height: height * 2
      }).data;
      const png = datauri.format(".png", buffer);
      resolve(png);
    });
  });
}

Not sure if this error is related to stream or my promise logic. Any ideas?

Dependencies:

"librsvg": "0.7.0" "pdfmake": "0.1.35" "datauri": "1.0.5"


Solution

  • It pays to list all the used modules. Assuming you used datauri, it seems you need to initialize a new instance for every call:

          svg.on("finish", function() {
              const datauri = new Datauri();
              const buffer = svg.render({
                  format: "png",
                  width: 16,
                  height: 16
              }).data;
              const png = datauri.format(".png", buffer);
              resolve(png);
          });