代码之家  ›  专栏  ›  技术社区  ›  dot

HTML2Canvas-是否可以将隐藏的div打印为pdf?

  •  0
  • dot  · 技术社区  · 7 年前

    背景

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

    • 带蓝色徽标的PDF
    • 带粉色徽标的PDF

    等。

    我知道怎么做: 1。我知道如何在jquery中遍历表中选定的记录 2。我知道如何创建一个基本的jspdf文档。 三。“模板”机制只是在网页中预定义的两种不同的机制。根据它们在下拉菜单中选择的选项,我可以确定要包含哪个徽标。

    问题

    似乎除非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;
        }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Weihui Guo vmax1909    7 年前

    你可以做的是暂时显示隐藏的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>
    
        2
  •  0
  •   ahcyT    7 年前

    你试过把这个添加到你的css中吗

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

    请参阅 here 有关打印不可见内容的问题。