關於如何***使用jspdf***,已經在這兩篇博文中介紹過了
然而衆所周知,這是歪果仁寫的,並不支持中文!!!
從這裏就走上一段段不歸路,跳進一個個神坑,查閱到的博客都是坑,一大部分是抄來抄去,一大部分就是瞎寫。。。我是怎麼知道的,當然是 都愛過 試過了
代碼和目錄結構
這個font.js
裏面放的是一段““簡體蘋方””的字體的base64
代碼,這個base64
代碼怎麼獲取下面會說,然後用一個隨便自定義變量var moo=''
來定義:
js文件夾
裏面放的除了faker.min.js
是無用的,是爲了生成假數據的,jquery.js
也可以忽略,因爲我用的是原生js,當然你要用就用,剩下兩個要用的都是官方文檔能找到的js文件。
然後就是index.html
的內容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>解決中文pdf亂碼-----終極版</title>
</head>
<body>
<button onclick="generate()">導出 pdf</button>
<!-- pdf展示 -->
<div style="height: 600px;">
<iframe id="output" src="" frameborder="0" width="100%" height="90%"></iframe>
</div>
<!--以下所引入都是官方都有的文件-->
<script src="./js/jquery-1.10.2.min.js"></script>
<!-- ==== 這個js用了官方要不亂碼,要不報錯,我用的是從別的cdn庫下載的 -->
<script src="./js/jspdf.min.js"></script>
<!-- ===== -->
<!-- 這個js是渲染pdf表格的 -->
<script src="./js/jspdf.plugin.autotable.src.js"></script>
<!-- 這個js是自己生成的base64字體代碼放的字體文件 -->
<script src="./font/font.js"></script>
<script>
var columns = ["吃飯", "名字", "規範化", "好友推薦"]; // 表頭
var data = [ // tableDate
['第三方', "花花", '菜單', "間距"],
['第三方', "花花", '菜單', "間距"],
['第三方', "花花", '菜單', "間距"]
];
var doc = new jsPDF('p', 'pt'); // 獲取實例
// =============================== 設置字體
doc.addFileToVFS('pingfang.ttf', moo) // 這個地方就是font.js裏面自定義的變量 moo
doc.addFont('pingfang.ttf', 'custom', 'normal'); // custom 是自定義的字體名稱,後面的normal不能改,不管你是什麼字體樣式都不能改
doc.setFont('custom');
// ===============================
doc.autoTable(columns, data, {styles: {font: 'custom'}}); // 渲染table,設置table字體也是custom,要不然表格中文還是亂碼
doc.text(40, 30, '個人號還挺好') // 渲染title
document.getElementById("output").src = doc.output('datauristring'); // 渲染pdf
function generate() { // 導出pdf
doc.save("table.pdf");
}
</script>
</body>
</html>
然後看頁面效果,看到效果的時候,我都熱淚盈眶:
如何獲取base64字體文件
因爲你要用的是中文字體:首先找到你電腦裏面安裝的中文的.ttf
的字體文件,在C盤裏面全局搜索.ttf
就會出現很多字體,我這裏用““簡體蘋方””示例,注意這個文件拿出來放桌面,名稱改成小寫的:
然後要把這個文件轉爲base64
格式的文件,首先在jsPDF的官網github上將整個項目克隆到本地,然後找到如下圖所示的html文件
:
打開之後,上傳你剛剛存在桌面的pingfang.ttf
的文件(注意名字必須小寫):
點擊Creat
這個按鈕,就會生成一個js文件,打開這個js文件,你會發現裏面有一段代碼,我們只需要很長很長很長的那一段base64
字符串,複製出來放進font.js
的自定義變量裏面,就完啦!
敲黑板!!!
就這中文亂碼,簡直了簡直了,感覺是左腳剛出坑,又腳又進去:
包括在你渲染表格和標題的時候,順序都不能亂,要不然就是亂碼
還有引入官方的
jspdf.debug.js
和jspdf.min.js
效果都不一樣,要不亂碼,要不報錯doc.addFileToVFS is not function...
,
還有這個
jspdf.plugin.autotable.src.js
,官方的也有壓縮版,和上面那個js搭配竟然也是一會報錯,一會表格沒有樣式,都疊在一起,就這個和上面的bug,整了一天
這三個bug只不過是我遇到的無數個想撞牆的其中三個
你都想象不到bug會出現在哪裏,枯了枯了
如果有小夥伴照我的來,也可能會出現報錯或者亂碼,應該因爲是那個jspdf.min.js
的版本問題,我沒用官方的,用了別的cdn庫下載的,我也是試了無數才試出來,有要資源的私信我。
就醬~