jsPDF將HTML轉(zhuǎn)為PDF文件

0.說明

jsPDF支持在靜態(tài)網(wǎng)頁(yè)中直接將html代碼轉(zhuǎn)為pdf文件,但并不支持中文字符,雖然可以通過addhtml的方式來變相實(shí)現(xiàn),但轉(zhuǎn)出來的PDF文件中所有內(nèi)容都是圖片,分辨率并不高,且默認(rèn)不支持分頁(yè);盡管提供了分頁(yè)的選項(xiàng),但分頁(yè)效果真的很差。


1.jsPDF資源

Github: https://github.com/MrRio/jsPDF
官網(wǎng): http://rawgit.com/MrRio/jsPDF/master/docs/index.html


2.用法說明

2.1 簡(jiǎn)單的用法

將jspdf的文件 jspdf.debug.js(或壓縮后的 jspdf.min.js)引入html頁(yè)面,然后執(zhí)行下面代碼即可:

var doc = new jsPDF()

doc.text('Hello world!', 10, 10)
doc.save('hello.pdf')

打開網(wǎng)頁(yè),即可下載:

Paste_Image.png

3.使用pdf.addHTML()方法

pdf.addHTML()方法其實(shí)就是把指定的DOM元素轉(zhuǎn)為一個(gè)canvas圖片,然后把這個(gè)圖片輸出到一個(gè)PDF文檔中。也正是這種方法,導(dǎo)致了它對(duì)分頁(yè)支持得很差。


3.1 簡(jiǎn)單的例子

下面是一個(gè)最簡(jiǎn)單的例子:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>jsPDF Demo</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="description" content="">
        <meta name="author" content="">

        <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script> 
        <script src="js/jspdf.debug.js"></script>
    </head>
    
    <body>
        <div id="ol_article_content">
            <h1>
              Hello World!
            </h1>
        </div>
   </body>
        
    <script>
    
        var pdf = new jsPDF('p', 'mm', 'a4'); 
        var print_content = $('#ol_article_content'); 
        var filename = 'hello.pdf'; 
        
        pdf.addHTML($('#ol_article_content'), function(){
            pdf.output("save", filename)
        })
    </script>

</html>

3.2 背景色

我們發(fā)現(xiàn),輸出的文件內(nèi)容背景色是黑色的。

Paste_Image.png

解決方法是,對(duì) $('#ol_article_content')元素設(shè)置背景色:

var pdf = new jsPDF('p', 'mm', 'a4'); 
var print_content = $('#ol_article_content'); 
var filename = 'hello.pdf'; 

// 修改背景色
$('#ol_article_content').css("background", "#fff")

pdf.addHTML($('#ol_article_content'), function(){
    pdf.output("save", filename)
})

修改后,刷新網(wǎng)頁(yè)得到下載文件:

Paste_Image.png

3.3 設(shè)置文檔樣式

從3.2中我們可以發(fā)現(xiàn),對(duì) $('#ol_article_content')元素設(shè)置的屬性,最終都會(huì)展現(xiàn)在pdf文件中。也就是說,我們?nèi)绻薷奈臋n的樣式,只需要對(duì) $('#ol_article_content')元素進(jìn)行設(shè)置屬性就可以了。

比如,我們要設(shè)置這個(gè)文檔的左右邊距為 80px 、上下邊距為 50px,則:

...

// 修改背景色
$('#ol_article_content').css("padding", "50px 80px")

pdf.addHTML($('#ol_article_content'), function(){
    pdf.output("save", filename)
})

效果:

Paste_Image.png

4.存在的問題

4.1 無法轉(zhuǎn)換圖片

如果我們把一個(gè)圖片標(biāo)簽放入 $('#ol_article_content')元素內(nèi):

<div id="ol_article_content">
    <h1>
        Hello World!
    </h1>
    ![](https://www.onelib.biz/upload/201611122328074535.jpg)
</div>

結(jié)果并沒有什么圖片:

Paste_Image.png

4.2 分頁(yè)效果差

按照網(wǎng)上看到的方法,我們?cè)谏蓀df時(shí)增加一個(gè)屬性:options = { pagesplit: true }

var pdf = new jsPDF('p', 'mm', 'a4'); 
var print_content = $('#ol_article_content'); 
var filename = 'hello.pdf'; 

// 分頁(yè)
var options = { pagesplit: true };

pdf.addHTML($('#ol_article_content'), options, function(){
    pdf.output("save", filename)
})

然而效果簡(jiǎn)直慘不忍睹,下圖左邊是原網(wǎng)頁(yè),右邊是自動(dòng)分頁(yè)后的pdf文件。

Paste_Image.png

網(wǎng)上看到的一個(gè)處理分頁(yè)問題的Demo,但是效果仍然不怎樣:

var pdf = new jsPDF('p', 'pt', 'a4');
var options = {
         pagesplit: true
    };

pdf.addHTML($(".pdf-wrapper"), options, function()
{
    pdf.save("test.pdf");
});

function printbypage(pdf, k){
  if(k >= $('.my_show').length)
  {
    pdf.output('dataurlnewwindow');
  }
  pdf.addHTML($('.my_show')[k], function(){
    if(k < $('.my_show').length - 1)
    {
      pdf.addPage();
    }
    printbypage(pdf, k + 1);
  });
};

function printmyshow() {
  var pdf = new jsPDF('p', 'mm', 'a4');
  printbypage(pdf, 0);
};

5.其他的html轉(zhuǎn)pdf方法

  • PDFKIT
  • html-pdf

這兩個(gè)方法還沒搞成,后面再看看了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容