jspdf не может правильно захватить содержимое div для загрузки в старшем формате в формате pdf - PullRequest
0 голосов
/ 31 октября 2018

Я хочу загрузить содержимое html в pdf fprmat, но здесь, в моем случае, я использую старшие диаграммы, но когда я загружаю pdf, он не может захватить содержимое диаграммы, он может захватывать только текстовое содержимое. Я использовал все дополнительные плагины, такие как addimage, стандартный шрифт и т. Д., Хотя он не может печатать. Есть ли другой плагин, который мне нужно использовать, или мне нужно использовать какой-либо плагин highcharts для этого, вот код ниже

    $(function () {
    
        var specialElementHandlers = {
            '#editor': function (element,renderer) {
                return true;
            }
        };
     $('#cmd').click(function () {
            var doc = new jsPDF();
            doc.fromHTML(
                $('#container').html(), 15, 15, 
                { 'width': 170, 'elementHandlers': specialElementHandlers }, 
                function(){ doc.save('sample-file.pdf'); }
            );
    
        });  
    });
    Highcharts.chart('container', {
    
        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'
                    }
                }
            }]
        }
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/ui/1.12.0-beta.1/jquery-ui.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.1.135/jspdf.min.js"></script>
    <script type="text/javascript" src="http://cdn.immex1.com/js/jspdf/plugins/jspdf.plugin.addimage.js"></script>
    <script type="text/javascript" src="http://cdn.immex1.com/js/jspdf/plugins/jspdf.plugin.standard_fonts_metrics.js"></script>
    <script type="text/javascript" src="http://cdn.immex1.com/js/jspdf/plugins/jspdf.plugin.split_text_to_size.js"></script>
    <script type="text/javascript" src="http://cdn.immex1.com/js/jspdf/plugins/jspdf.plugin.from_html.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>
    <div id="container"></div>
     <button id="cmd">generate PDF</button>

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Чтобы получить содержимое диаграмм, вам нужно преобразовать часть HTML в canvas, скачайте пакет npm html2canvas. Существует встроенная функция html2canvas, которая принимает идентификатор элемента в качестве аргумента и возвращает холст. Возвращенный холст можно добавить в документ с помощью функции addImage.

//you need to import html2canvas
import * as html2canvas from 'html2canvas'
$(function () {

$('#cmd').click(function () {
   var doc = new jsPDF();
   let chartelement = document.getElementById('container');

function tellMeWhenToReturn(){
return new Promise((resolve) => {
  const elementToPrint = document.getElementById(id) //The html element to become a pdf
  html2canvas(elementToPrint).then((canvas) => {
    const contentDataURL = canvas.toDataURL('image/png');
    resolve(contentDataURL );
  });
});
}

tellMeWhenToReturn().then((data)=>{
  doc.addImage(data, 'margin', 'widthimage', 'imageheight');
 });


    });  
});
0 голосов
/ 31 октября 2018

Для загрузки содержимого диаграммы вы можете использовать экспорт Highcharts. Для экспорта по пользовательской кнопке можно использовать метод chart.exportChart :

$('#cmd').click(function() {
  chart.exportChart({
    type: 'application/pdf',
    filename: 'my-pdf'
  });
});

Обратите внимание, дополнительно модуль экспорта должен быть загружен после сценария старших графиков.

Ссылка на документацию:
https://www.highcharts.com/docs/export-module/export-module-overview

Демо:
https://jsfiddle.net/wchmiel/ue3pav2g/1/


EDIT:

Чтобы загрузить несколько диаграмм с использованием jspdf, вам необходимо выполнить следующие шаги:

  1. отправить AJAX на сервер Highcharts с опциями для каждого из графиков. Возвращаемым будет URL-адрес изображения на сервере.
  2. конвертировать изображения с сервера Highcharts в формат base64. (Вы можете использовать этот подход: https://stackoverflow.com/a/20285053/10077925)
  3. Добавьте изображения диаграмм, логотип, нижний колонтитул в pdf с помощью библиотеки jspdf и сохраните результат.

Код:

  $('#cmd').click(function() {
    var obj = {
        options: JSON.stringify(chartOptions),
        type: 'image/png',
        async: true
      },
      exportUrl = 'https://export.highcharts.com/',
      imgContainer = $("#container"),
      doc = new jsPDF(),
      chartsLen = 1,
      imgUrl;

    var calls = [];

    for (var i = 0; i < chartsLen; i++) {
      calls.push({
        type: 'post',
        url: exportUrl,
        data: obj,
      });
    }

    $.when(
      $.ajax(calls[0])
    ).done(function(c1) {

      imgUrl = exportUrl + c1;

      toDataURL(imgUrl)
        .then(dataUrl => {
          doc.setFontSize(30);
          doc.text(35, 25, 'First caption');
          doc.addImage(dataUrl, 'PNG', 15, 40);
          doc.text(35, 175, 'Second caption');
          doc.addImage(dataUrl, 'PNG', 15, 185);
          doc.save('sample-file.pdf');
        })
    });
  });

Демо: https://jsfiddle.net/wchmiel/4a8u16ck/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...