Your search did not match any results.
Charts

Export Custom Markup

The DevExpress.viz.exportFromMarkup(markup, options) method allows you to export SVG content, including SVG-based DevExtreme widgets, to an image or document.

The markup parameter accepts valid SVG markup (see the prepareMarkup() function in the code). If the exported document should contain an SVG-based DevExtreme widget, call the svg() method to get its markup.

The options parameter accepts an object whose fields configure export options. In this demo, we specify the width, height, format, and svgToCanvas fields. Refer to the method description for more information on these and other available fields.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import { Chart, CommonSeriesSettings, Series, Legend, Title, Subtitle } from 'devextreme-react/chart'; import { Button } from 'devextreme-react/button'; import { dataSource } from './data.js'; import Form from './Form.js'; import { exportFromMarkup } from 'devextreme/viz/export'; import toCanvas from 'canvg'; const barPadding = 0.3; function prepareMarkup(chartSvg, markup) { return '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="820px" height="420px">' + `${markup}<g transform="translate(305,12)">${chartSvg}</g></svg>`; } class App extends React.Component { constructor(props) { super(props); this.chartRef = React.createRef(); this.onClick = this.onClick.bind(this); this.onRef = this.onRef.bind(this); } render() { return ( <div id="chart-demo"> <div className="chart_environment"> <Form onRef={this.onRef} /> <Chart ref={this.chartRef} id="chart" dataSource={dataSource} palette="Violet" > <CommonSeriesSettings barPadding={barPadding} argumentField="state" type="bar" /> <Series valueField="year1990" name="1990" /> <Series valueField="year2000" name="2000" /> <Series valueField="year2010" name="2010" /> <Series valueField="year2016" name="2016" /> <Series valueField="year2017" name="2017" /> <Legend verticalAlignment="bottom" horizontalAlignment="center" /> <Title text="Oil Production"> <Subtitle text="(in millions tonnes)" /> </Title> </Chart> </div> <div className="controls-pane"> <Button id="export" width={145} icon="export" text="Export" type="default" onClick={this.onClick} /> </div> </div> ); } get chart() { return this.chartRef.current.instance; } onClick() { exportFromMarkup(prepareMarkup(this.chart.svg(), this.child.getElement().innerHTML), { width: 820, height: 420, margin: 0, format: 'png', svgToCanvas(svg, canvas) { return new Promise((resolve) => { toCanvas(canvas, new XMLSerializer().serializeToString(svg), { ignoreDimensions: true, ignoreClear: true, renderCallback: resolve }); }); } }); } onRef(arg) { this.child = arg; } } export default App;
import React from 'react'; const fontFamily = "'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana, sans-serif"; class Form extends React.Component { componentDidMount() { this.props.onRef(this); } render() { return ( <div id="custom_markup_container" ref={node => this.node = node}> <svg width="820px" height="420px"> <path d="M 13 407 L 128 407 L 232 39 L 13 39" fill="#6D39C3"></path> <path d="M 46 381 L 161 381 L 265 13 L 46 13" opacity="0.5" fill="#6D39C3"></path> <path d="M 638 365 L 630 396 L 799 396 L 807 365" fill="#6D39C3"></path> <path d="M 609 376 L 601 407 L 770 407 L 778 376" opacity="0.5" fill="#6D39C3"></path> <text transform="translate(30,89)" style={{ fill: '#FFFFFF', fontFamily, fontSize: 36, fontWeight: 'bold' }}> <tspan x="0" y="0">Export </tspan> <tspan x="0" y="38">Custom</tspan> <tspan x="0" y="76">Markup</tspan> </text> <text transform="translate(32,199)" style={{ opacity: 0.8, fill: '#FFFFFF', fontFamily, fontSize: 14 }}> <tspan x="0" y="0">Export a chart with</tspan> <tspan x="0" y="19.2">custom elements</tspan> </text> <text x="650" y="385" style={{ opacity: 0.8, fill: '#FFFFFF', fontFamily, fontSize: 12 }}>UNdata (www.data.un.org)</text> <path opacity="0.8" d="M 0 0 L 820 0 L 820 420 L 0 420 L 0 0" stroke="#999999" strokeWidth="1" strokeLinecap="butt" fill="none" strokeLinejoin="miter"></path> </svg> </div> ); } getElement() { return this.node; } } export default Form;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('app') );
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import('./index.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
#chart-demo { height: 460px; } #chart { position: absolute; top: 12px; right: 35px; width: 480px; height: 347px; } .chart_environment { width: 820px; position: relative; margin: 0 auto; } .controls-pane { text-align: center; }
export const dataSource = [{ state: 'Saudi Arabia', year1990: 319.6, year2000: 408.4, year2010: 407, year2016: 523, year2017: 496.6 }, { state: 'USA', year1990: 362.8, year2000: 287.9, year2010: 270.2, year2016: 438, year2017: 461.4 }, { state: 'China', year1990: 138.3, year2000: 163, year2010: 203, year2016: 199.7, year2017: 191.5 }];
System.config({ transpiler: 'plugin-babel', paths: { 'npm:': 'https://unpkg.com/' }, defaultExtension: 'js', map: { 'react': 'npm:react@16/umd/react.development.js', 'react-dom': 'npm:react-dom@16/umd/react-dom.development.js', 'prop-types': 'npm:prop-types/prop-types.js', 'devextreme': 'npm:devextreme@19.2', 'devextreme-react': 'npm:devextreme-react@19.2', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'stackblur-canvas': 'npm:stackblur-canvas', 'rgbcolor': 'npm:rgbcolor', 'canvg': 'npm:canvg@2', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, packages: { 'devextreme': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' } }, babelOptions: { sourceMaps: false, stage0: true, react: true } });