2016-05-10 56 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