html2canvas-是否可以将隐藏的DIV打印到pdf?

时间:2019-02-15 18:37:19

标签: javascript jquery jspdf html2canvas

背景

我有一个记录表,该记录表使用“制表符”控件来允许用户进行排序,过滤等。 一旦他们在表中获得了想要的结果,我就需要提供一种方法,使用户可以使用PDF模板触发每行创建PDF。 在页面顶部,我有一个下拉菜单,他们可以在其中选择模板。例如,它将具有以下选项:

  • 带有蓝色徽标的pdf
  • 带有粉红色徽标的pdf

我知道该怎么做 1.我知道如何遍历jQuery中表中的选定记录 2.我知道如何创建基本的jsPDF文档。 3.“模板”机制将只是网页中预定义的2种不同。根据他们在下拉菜单中选择的选项,我可以确定要包括的徽标。

问题

似乎,除非将包含在PDF中的DIV可见,否则html2canvas将无法工作。

到目前为止,这是我一直在玩的原型代码: (除了我尝试以PDF格式显示的DIV在屏幕上显示的事实之外,其他所有方法都起作用。)

<div id="bluetemplate" class="ug_logo_style" style="display: none">
    <img class="bluelogo"></img>
</div>
<div id="pinktemplate" class="ug_logo_style" style="display: none">
    <img class="pinklogo"></img>
</div>

$("#templatedropdown").change(function(){
   var selectedtemplate = this.value;
   switch (selectedtemplate){
        case 'blue':
            $("div#bluetemplate").show();
            $("div#pinktemplate").hide();
            break;
        case 'pink':
            $("div#pinktemplate").show();
            $("div#bluetemplate").hide();
            break;
   }
});

$("#btntemplate").click(function(){
    switch($('#template option:selected').val()){
        case 'blue':            
            var imgData;
            html2canvas($("#bluetemplate"), {
                useCORS: true,
                onrendered: function (canvas) {
                    imgData = canvas.toDataURL(
                       'image/png');
                    var doc = new jsPDF({
                        orientation: 'landscape', 
                        unit:'pt', 
                        format:[400,200]});
                    doc.addImage(imgData, 'PNG', 10, 10);

                    doc.text(registrant.first_name + " " + registrant.last_name, 10, 100);
                    doc.text(registrant.email, 10, 120);                   
                    doc.save(registrant.event_id + '_' + registrant.id + '.pdf');
                    window.open(imgData);
                }
            });

            break;
        case 'pink':
            var imgData;
            html2canvas($("#pinktemplate"), {
                useCORS: true,
                onrendered: function (canvas) {
                    imgData = canvas.toDataURL(
                       'image/png');
                    var doc = new jsPDF({
                        orientation: 'landscape', 
                        unit:'pt', 
                        format:[400,200]});
                    doc.addImage(imgData, 'PNG', 10, 10);

                    doc.text(registrant.first_name + " " + registrant.last_name, 10, 100);
                    doc.text(registrant.email, 10, 120);                   
                    doc.save(registrant.event_id + '_' + registrant.id + '.pdf');
                    window.open(imgData);
                }
            });

            break;
    }

2 个答案:

答案 0 :(得分:0)

您可以做的是暂时显示隐藏的div,将其转换为pdf,然后再次将其隐藏。但是,如果只显示徽标一秒钟是可以接受的,这只是一种解决方法。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js" 
        integrity="sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/"
        crossorigin="anonymous"></script>
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
<!-- html2canvas 1.0.0-alpha.11 or higher version is needed -->
<script>
    function download() {
        let pdf = new jsPDF('p', 'pt', 'a4');
        pdf.setProperties({
            title: 'jsPDF sample'
        }); // used for window.open() only
        let bluetemplate = document.getElementById('bluetemplate');
        bluetemplate.style.display = '';
        pdf.html(document.body, {
            callback: function () {
                //pdf.save('test.pdf');
                window.open(pdf.output('bloburl')); // to debug
                bluetemplate.style.display = 'none';
            }
        });
    }
</script>

答案 1 :(得分:0)

您是否尝试过将其添加到CSS中

.html2canvas-container { width: 3000px !important; height: 3000px !important; }

有关打印不可见内容的问题,请参考here