2016-05-10 28 views
10

我正在使用jsPDF将html转换为pdf。在某些情况下,html有svg图表,一些数据在生成的pdf中被复制。使用jsPDF创建的pdf中的重复内容

例如如果图表有传说,它们会重复。请参阅下面的截图。城市名称和百分比重复。

enter image description here

下面是创建PDF的代码。

pdf.addHTML($("#page1"), options, function(){ 
      pdf.addPage(); 
      pdf.addHTML($("#page2"), options, function(){ 
       pdf.addPage(); 
       pdf.output('dataurlnewwindow'); 
      }); 
     }); 

编辑1:

这是我迄今想通。

<div id="outerDiv"> 
    <div id="pieChart"></div> 
</div> 

当我这样做,pdf.addHTML($("#pieChart"),这里没有问题。

但是,当我这样做时,pdf.addHTML($("#outerDiv"),然后标签重复。

,这是我如何生成我c3js图表

var pieChart = c3.generate({ 
      bindto: '#pieChart', 

编辑2: -

下面是我的全部代码。

<!DOCTYPE html> 
<html> 

<head> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.js"></script> 
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.css"> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.js"></script> 
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script> 
    <script type="text/javascript" src="http://gabelerner.github.io/canvg/rgbcolor.js"></script> 
    <script type="text/javascript" src="http://gabelerner.github.io/canvg/StackBlur.js"></script> 
    <script type="text/javascript" src="http://gabelerner.github.io/canvg/canvg.js"></script> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.min.js"></script> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.5.0-alpha1/html2canvas.js"></script> 

    <script type='text/javascript'> 
    function replaceAllSVGsWithTempCanvas(elemSelector) { 
     var svgElements = $(elemSelector).find('svg'); 

     //replace all svgs with a temp canvas 
     svgElements.each(function() { 
      var canvas, xml; 

      // canvg doesn't cope very well with em font sizes so find the calculated size in pixels and replace it in the element. 
      $.each($(this).find('[style*=em]'), function(index, el) { 
       $(this).css('font-size', getStyle(el, 'font-size')); 
      }); 

      canvas = document.createElement("canvas"); 
      canvas.className = "screenShotTempCanvas"; 

      //convert SVG into a XML string 
      xml = (new XMLSerializer()).serializeToString(this); 

      // Removing the name space as IE throws an error 
      xml = xml.replace(/xmlns=\"http:\/\/www\.w3\.org\/2000\/svg\"/, ''); 

      //draw the SVG onto a canvas 
      canvg(canvas, xml); 
      $(canvas).insertAfter(this); 

      //hide the SVG element 
      $(this).attr('class', 'tempHide'); 
      $(this).hide(); 
     }); 
    } 

    jQuery(document).ready(function($) { 
     genChart(); 
    }); 

    function genPDF() { 
     var options = { 
      background: '#fff' 
     }; 
     var pdf = new jsPDF('p', 'pt', 'a4'); 

     replaceAllSVGsWithTempCanvas(".content"); 

     pdf.addHTML($("#chartOuter"), options, function() { 
      pdf.output('dataurlnewwindow'); 

      $(".content").find('.screenShotTempCanvas').remove(); 
      $(".content").find('.tempHide').show().removeClass('tempHide'); 

     }); 
    } 

    function genChart() { 
     var chart = c3.generate({ 
      data: { 
       columns: [ 
        ['data1', 30], 
        ['data2', 120], 
       ], 
       type: 'pie' 
      } 
     }); 
    } 
    </script> 
</head> 

<body class="content"> 
    <table width="100%"> 
     <tr> 
      <td width="50%"> 
       <div id="chartOuter"> 
        <div id="chart"></div> 
       </div> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2" align="left"> 
       <input type="button" onclick="genPDF();" value="Generate PDF" /> 
      </td> 
     </tr> 
    </table> 
</body> 

</html> 

编辑3: -

我尝试了将HTML中使用html2canvas到画布上。它也给出了同样的问题。

编辑4:

我现在可以解决重复的问题。但是,图表和文字写成PDF格式有点模糊。基本上,我添加了函数replaceAllSVGsWithTempCanvas,然后在写入pdf时使用它。但似乎这个函数不会让HTML内容写出来,使内容写成pdf模糊。事实上,饼图等,没有更多的圈子,但看起来像椭圆形。

用修改后的js编辑该问题。

+0

请问您可以上传您的html,JS代码来提琴 – Raki

+0

@Raki我编辑了这个问题,并添加了所有的html和js代码。 – ashishjmeshram

+0

JUS add $(“。c3 svg”)。css({“font-size”:“0px”});之前pdf.addHTML(...正如我的anwer解释。;) –

回答

3

看起来像是在html2canvas中的错误。 html2canvas加载到修复后,您应该添加底部代码(学分去this guy):

NodeParser.prototype.getChildren = function(parentContainer) { 
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) { 
     var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement); 
     return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container; 
    }, this)); 
}; 

Fiddle

由于html2canvas负载为一个模块,你应该直接找到源代码和编辑NodeParser.prototype.getChildren它匹配上面。这意味着你无法从CDN加载它。

+0

我应该改变哪个文件? addhtml.js?或jspdf.debug.js? – ashishjmeshram

+0

@anything Umm,html2canvas.js。 –

+0

它修复了饼图问题,但问题仍然存在于条形图折线图中。 x和y轴上的标签重复。有任何想法吗? – ashishjmeshram

1

您可以尝试使用ChartJS而不是C3。

我调整了你的代码,并试着成功。

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.js"></script> 
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.css"> 

    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.js"></script> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.3/Chart.min.js"></script> 

    <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script> 

    <!-- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.debug.js"></script> --> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.min.js"></script> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.5.0-alpha1/html2canvas.js"></script> 
    <script type="text/javascript" src="https://raw.githubusercontent.com/MrRio/jsPDF/master/plugins/addhtml.js"></script> 

    <script type='text/javascript'> 

     jQuery(document).ready(function ($) { 
      genChart(); 
     }); 

     function genPDF() { 
      var options = { background: '#fff'}; 
      var pdf = new jsPDF('p', 'pt', 'a4'); 

      pdf.addHTML($("#chartOuter"), options, function() { 
       var string = pdf.output('datauristring'); 
       $('.preview-pane').attr('src', string) 
      }); 
     } 

     function genChart() { 
      var ctx = $("#chart"); 
      var options = {}; 

      var myPieChart = new Chart(ctx, { 
       type: 'pie', 
       data: { 
        labels: [ 
         "data1", 
         "data2" 
        ], 
        datasets: [{ 
          data: [30, 120], 
          backgroundColor: [ 
           "#FF6384", 
           "#36A2EB" 
          ], 
          hoverBackgroundColor: [ 
           "#FF6384", 
           "#36A2EB" 
          ] 
         }] 
       }, 
       options: options 
      }); 
     } 
    </script> 
</head> 
<body> 

    <table width="100%"> 
     <tr> 
      <td width="50%"> 
       <div id="chartOuter"> 
        <!-- <div id="chart"></div> --> 
        <canvas id="chart" width="400" height="400"></canvas> 
       </div> 
      </td> 
      <td> 
       <iframe height="550px" class="preview-pane" type="application/pdf" width="100%" frameborder="0" style="position:relative;z-index:999"></iframe> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2" align="left"> 
       <input type="button" onclick="genPDF();" value="Generate PDF"/> 
      </td> 
     </tr> 
    </table> 

</body> 
</html> 
+0

我们现在不能更改图表库,因为我们已经创建了很多图表,而且我们将不得不重写所有内容。在这个时候哪个是不可行的。 – ashishjmeshram

2

我认为它在两个步骤中正常工作。
首先,我评论了“addhtml插件”,因为我在控制台有此错误:

Refused to execute script from 'https://raw.githubusercontent.com/MrRio/jsPDF/master/plugins/addhtml.js' because its MIME type ('text/plain') is not executable, and strict MIME type checking is enabled. 

其次,我改变了PDF源从#chartOuter#chart

pdf.addHTML($("#chart"), options, function() { 
    var string = pdf.output('datauristring'); 
    $('.preview-pane').attr('src', string) 
}); 

而且没有更多的翻倍。

-----
编辑
(因为我误解了最初的问题)

使用外层div这是需要......也许整个页面。

好的......说实话,我不知道为什么会发生这个文本问题。
但我注意到,即使指定了“sans-serif”,重复文本也有衬线。
所以我专注于此。
我试图改变字体大小......它影响了重复,但文本没有遵循CSS规则。好的。

然后,我试图删除PDF创建部分之前的文本......还有魔法!
;)

$(".c3 svg").css({"font-size":"0px"}); 

下面是完整的剧本,我没有碰你原来代码的其余部分。

jQuery(document).ready(function ($) { 
     genChart(); 
    }); 

    function genPDF() { 
     var options = { background: '#fff'}; 
     var pdf = new jsPDF('p', 'pt', 'a4'); 

     $(".c3 svg").css({"font-size":"0px"}); // <-- This does the trick ! 

     pdf.addHTML($("#chartOuter"), options, function() { 
      var string = pdf.output('datauristring'); 
      $('.preview-pane').attr('src', string) 
     }); 
    } 

    function genChart() { 
     var chart = c3.generate({ 
      data: { 
       columns: [ 
        ['data1', 30], 
        ['data2', 120], 
       ], 
       type : 'pie' 
      } 
     }); 
    } 
+0

请在第一次编辑中看到我的意见。它适用于我使用#chart,但现在当我使用#chartOuter。 – ashishjmeshram

+0

好的......但是为什么你需要使用外部div呢? –

+0

请参阅我需要用pdf编写的html中有很多其他内容。我可以很好地选择图表div并写入pdf,但所有其他的CSS和HTML将不得不手动完成。 – ashishjmeshram