UNPKG

cl-react-graph

Version:
62 lines (60 loc) 2.24 kB
import { select } from 'd3-selection'; export type TOutputType = 'png' | 'blob'; export interface IWatermark { svg: string; width: number; height: number; } // Method to combine an svg specified by id with the InfoSum watermark and // produce a blob or png output that can be used for download export const outputSvg = ( svgId: string, width: number, height: number, callback: (outputData: string | Blob | null) => void, watermark: IWatermark, type: TOutputType = 'blob', ) => { // Select the first svg element const svg: any = select(`svg#${svgId}`); const serializer = new XMLSerializer(); // generate IMG in new tab const svgStr = serializer.serializeToString(svg.node()); const svgData = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(svgStr))); // create canvas in memory(not in DOM) const canvas = document.createElement('canvas'); // set canvas size canvas.width = width + 20 + watermark.width; canvas.height = height + 20; // get canvas context for drawing on canvas const context = canvas.getContext('2d'); // create images in memory(not DOM) var image = new Image(); const watermarkImage = new Image(); // when watermark loaded create main image watermarkImage.onload = () => { // later when image loads run this image.onload = () => { // clear canvas context!.clearRect(0, 0, canvas.width, canvas.height); // draw image with SVG data to canvas context!.drawImage(image, 10, 10, width, height); context!.drawImage(watermarkImage, canvas.width - watermark.width - 10, 10, watermark.width, watermark.height); // add a background context!.globalCompositeOperation = 'destination-over' context!.fillStyle = "#FFF"; context!.fillRect(0, 0, canvas.width, canvas.height); // snapshot canvas as png or blob depending on type if (type === 'blob') { canvas.toBlob(callback); } else if (type === 'png') { const pngData = canvas.toDataURL('image/png'); callback(pngData); } }; // start loading SVG data into in memory image image.src = svgData; } // start loading watermark SVG data into memory watermarkImage.src = watermark.svg; };