diff --git a/src/DocMeasure.js b/src/DocMeasure.js index 87892281b..72aeb027f 100644 --- a/src/DocMeasure.js +++ b/src/DocMeasure.js @@ -114,17 +114,29 @@ class DocMeasure { } convertIfBase64Image(node) { - if (/^data:image\/(jpeg|jpg|png);base64,/.test(node.image)) { // base64 image + if (/^data:image\/(jpeg|jpg|png|svg+xml);base64,/.test(node.image)) { // base64 image let label = `$$pdfmake$$${this.autoImageIndex++}`; this.pdfDocument.images[label] = node.image; node.image = label; } } + chekIfIsSVG(imageSource) { + // read the first 1000 bytes instead of 4 to allow for possible whitespace + return imageSource.toString('utf-8', 0, 1000).includes(' { + provideImageSource(src) { + const getRealImageSrc = src => { let image = this.images[src]; if (!image) { @@ -102,6 +102,17 @@ class PDFDocument extends PDFKit { return Buffer.from(image.substring(index + 7), 'base64'); }; + const realImageSrc = getRealImageSrc(src); + + // convert to Buffer if in browser context + if (realImageSrc instanceof ArrayBuffer) { + return Buffer.from(new Uint8Array(realImageSrc)); + } + + return realImageSrc; + } + + provideImage(src, imageSource) { if (this._imageRegistry[src]) { return this._imageRegistry[src]; } @@ -109,7 +120,7 @@ class PDFDocument extends PDFKit { let image; try { - image = this.openImage(realImageSrc(src)); + image = this.openImage(imageSource); if (!image) { throw new Error('No image'); } diff --git a/src/SVGMeasure.js b/src/SVGMeasure.js index 3d04d8dac..07cf7dcd0 100644 --- a/src/SVGMeasure.js +++ b/src/SVGMeasure.js @@ -69,6 +69,10 @@ class SVGMeasure { writeDimensions(svgString, dimensions) { let doc = parseSVG(svgString); + if ( typeof doc.attr.viewBox !== 'string' ) { + doc.attr.viewBox = `0 0 ${stripUnits(doc.attr.width)} ${stripUnits(doc.attr.height)}`; + } + doc.attr.width = "" + dimensions.width; doc.attr.height = "" + dimensions.height; diff --git a/tests/unit/LayoutBuilder.spec.js b/tests/unit/LayoutBuilder.spec.js index c98a7f21c..91a0bcd33 100644 --- a/tests/unit/LayoutBuilder.spec.js +++ b/tests/unit/LayoutBuilder.spec.js @@ -48,6 +48,9 @@ var sampleTestProvider = { descender: -50 }; }, + provideImageSource(src) { // eslint-disable-line no-unused-vars + return {}; + }, provideImage(src) { // eslint-disable-line no-unused-vars return { width: 1,