【问题标题】:How to use jspdf to print and download the multiple highcharts contents in pdf format如何使用jspdf打印下载pdf格式的多个highcharts内容
【发布时间】:2019-04-06 00:03:21
【问题描述】:

这里我有多个来自highcharts的图表,这些图表可以是多个动态来的,这里我只展示了2个。我需要下载一些div的内容以及页面中的所有highcharts。我可以可以使用 jspdf 插件,但是当它出现多个图表时,我无法下载它。我已经更新了 plunker http://plnkr.co/edit/Z3hJcC8pgzZxXPLWpfBw?p=preview 中的工作代码,下面是我的代码。 其他库可以在上面的 url 中找到。

html

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
     <script src="jspdf.debug.js"></script>
     <script src="https://code.highcharts.com/highcharts.js"></script>
    <script src="https://code.highcharts.com/modules/series-label.js"></script>
    <script src="https://code.highcharts.com/modules/exporting.js"></script>
    <script src="https://code.highcharts.com/modules/export-data.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
      <script src="https://github.com/devongovett/pdfkit/releases/download/v0.6.2/pdfkit.js"></script>
      <script src="rgbcolor.js"></script>
      <script src="canvg.js"></script>
      <script src="script.js"></script>
    </head>

    <body>
      <input type="button" onclick="chartWithContentDownload()" value="download" /> Please click on this button to get chart with html content on pdf

      <div class="white-back row" style="padding: 1.5rem;" id="tvgMainCnt">
        <div id="top-content">
          <div>
            <div>
              logo
            </div>
            </div>
          <div style="margin-top: 1rem;">
            <p>
              Dear members,
            </p>
          </div>
          <div>
            Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book
          </div>
          <br />
          <div style="margin-top: 1rem;">
            <p>
              Download of chart with html content should work with multiple chart.
            </p>
          </div>
        </div>
        <div id="middle-content">
          <div id="testchart"></div>
          <div id="testchart2"></div>
        </div>
        <div id="bottom-content">
          <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. </p>
        </div>
      </div>

script.js

$(document).ready(function(){
   Highcharts.chart('testchart', {

    title: {
        text: 'Solar Employment Growth by Sector, 2010-2016'
    },

    subtitle: {
        text: 'Source: thesolarfoundation.com'
    },

    yAxis: {
        title: {
            text: 'Number of Employees'
        }
    },
    legend: {
        layout: 'vertical',
        align: 'right',
        verticalAlign: 'middle'
    },

    plotOptions: {
        series: {
            label: {
                connectorAllowed: false
            },
            pointStart: 2010
        }
    },

    series: [{
        name: 'Installation',
        data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
    }, {
        name: 'Manufacturing',
        data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
    }, {
        name: 'Sales & Distribution',
        data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
    }, {
        name: 'Project Development',
        data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
    }, {
        name: 'Other',
        data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
    }],

    responsive: {
        rules: [{
            condition: {
                maxWidth: 500
            },
            chartOptions: {
                legend: {
                    layout: 'horizontal',
                    align: 'center',
                    verticalAlign: 'bottom'
                }
            }
        }]
    }

});
  Highcharts.chart('testchart2', {

    title: {
        text: 'Solar Employment Growth by Sector, 2010-2016'
    },

    subtitle: {
        text: 'Source: thesolarfoundation.com'
    },

    yAxis: {
        title: {
            text: 'Number of Employees'
        }
    },
    legend: {
        layout: 'vertical',
        align: 'right',
        verticalAlign: 'middle'
    },

    plotOptions: {
        series: {
            label: {
                connectorAllowed: false
            },
            pointStart: 2010
        }
    },

    series: [{
        name: 'Installation',
        data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
    }, {
        name: 'Manufacturing',
        data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
    }, {
        name: 'Sales & Distribution',
        data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
    }, {
        name: 'Project Development',
        data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
    }, {
        name: 'Other',
        data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
    }],

    responsive: {
        rules: [{
            condition: {
                maxWidth: 500
            },
            chartOptions: {
                legend: {
                    layout: 'horizontal',
                    align: 'center',
                    verticalAlign: 'bottom'
                }
            }
        }]
    }

});
  });
   function chartWithContentDownload() {
    var doc = new jsPDF('portrait', 'pt', 'a4', true);
    var elementHandler = {
      '#ignorePDF': function(element, renderer) {
        return true;
      }
    };

    var source = document.getElementById("top-content");
    doc.fromHTML(source, 15, 15, {
      'width': 560,
      'elementHandlers': elementHandler
    });

    var svg = document.querySelector('svg');
    var canvas = document.createElement('canvas');
    var canvasIE = document.createElement('canvas');
    var context = canvas.getContext('2d');
    var DOMURL = window.URL || window.webkitURL || window;
    var data1 = (new XMLSerializer()).serializeToString(svg);
    canvg(canvas, data1);
    var svgBlob = new Blob([data1], {
      type: 'image/svg+xml;charset=utf-8'
    });

    var url = DOMURL.createObjectURL(svgBlob);

    var img = new Image();
    img.onload = function() {
      context.canvas.width = $('#testchart').find('svg').width();
      console.log(context.canvas.width)
      context.canvas.height = $('#testchart').find('svg').height();

      context.drawImage(img, 0, 0);
      // freeing up the memory as image is drawn to canvas
      DOMURL.revokeObjectURL(url);

      var dataUrl;
                        if (isIEBrowser()) { // Check of IE browser 
                            var svg = $('#testchart').highcharts().container.innerHTML;
                            canvg(canvasIE, svg);
                            dataUrl = canvasIE.toDataURL('image/JPEG');
                        }
                        else{
                            dataUrl = canvas.toDataURL('image/jpeg');
                        }
      doc.addImage(dataUrl, 'JPEG', 20, 300, 560, 350);

      var bottomContent = document.getElementById("bottom-content");
      doc.fromHTML(bottomContent, 15, 650, {
        'width': 560,
        'elementHandlers': elementHandler
      });

      setTimeout(function() {
        doc.save('TestChart.pdf');
      }, 2000);
    };
    img.src = url;

  };
  function isIEBrowser(){
                    var ieBrowser;
                    var ua = window.navigator.userAgent;
                    var msie = ua.indexOf("MSIE ");

                    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // Internet Explorer
                    {
                      ieBrowser = true;
                    }
                    else  //Other browser
                    {
                      console.log('Other Browser');
                        ieBrowser = false;
                    }

                    return ieBrowser;
                };

【问题讨论】:

    标签: javascript jquery html highcharts jspdf


    【解决方案1】:

    这里的第一个问题是代码只处理一个图表/图像。该方法应包括各种元素的循环或多重处理。

    我已设法编辑您的代码,这是我的结果: http://plnkr.co/edit/qRT4dqJDMU8mTSocL3tb?p=preview

    var elements = [$('#testchart'), $('#testchart2')];
    
      for (let i in elements) {
    
          var svg = document.querySelector('svg');
          var canvas = document.createElement('canvas');
          var canvasIE = document.createElement('canvas');
          var context = canvas.getContext('2d');
    
          var data1 = (new XMLSerializer()).serializeToString(svg);
          canvg(canvas, data1);
          var svgBlob = new Blob([data1], {
            type: 'image/svg+xml;charset=utf-8'
          });
    
          var url = DOMURL.createObjectURL(svgBlob);
    
          var img = new Image();
          img.onload = function() {
            context.canvas.width = elements[i].find('svg').width();
            context.canvas.height = elements[i].find('svg').height();
    
            context.drawImage(img, 0, 0);
            // freeing up the memory as image is drawn to canvas
            DOMURL.revokeObjectURL(url);
    
            var dataUrl;
            if (isIEBrowser()) { // Check of IE browser 
              var svg = $(elements[i]).highcharts().container.innerHTML;
              canvg(canvasIE, svg);
              dataUrl = canvasIE.toDataURL('image/JPEG');
            } else {
              dataUrl = canvas.toDataURL('image/jpeg');
            }
            doc.addPage();
            doc.addImage(dataUrl, 'JPEG', 20, 20, 560, 350);
    
          };
          img.src = url;
        }
    
     var bottomContent = document.getElementById("bottom-content");
      doc.fromHTML(bottomContent, 15, 650, {
        'width': 560,
        'elementHandlers': elementHandler
      });
      setTimeout(function() {
        doc.save('TestChart.pdf');
      }, 2000);
    

    3 页的 PDF,包括图表和附加内容。 根据需要提供格式、清理和编辑。 希望对您有所帮助。

    【讨论】:

    • 感谢您的回答,但这里的图表来自 pdf 中的页眉和页脚。它应该像 html 一样位于页眉和页脚之间
    • 那个重复的代码是完全不同的,请你帮我格式化一下,即使位置正确,图表也在内容下方,它不像html
    • @carreankush 我刚刚设法将两个图表都包含在内。为了使其满足您的需求,首先尝试使用全局变量而不是固定变量。只需测试将元素的高度和宽度添加到您的 positionX、positionY 全局变量。与您已经拥有的相同,但没有恒定的。这样,如果需要,您可以在它们之间添加新元素。
    • 是的,我已经尽可能地更改和更新了我的 plunker 中的代码
    猜你喜欢
    • 2019-04-04
    • 2013-05-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多