做者:顏亦浠@毛豆前端javascript
這一次咱們來聊聊如何把頁面轉換成Pdf文件,常常會有這種場景,一些合同、協議等的頁面須要進行下載,並且須要和頁面保持一致,那麼最好的方式就是直接把頁面轉換成相應的格式就行了,目前基本上就是Doc和Pdf這2種比較流行,咱們就以Vue寫的頁面爲例來看看如何轉成Pdf文件。html
主要依賴兩個模塊:html2canvas和jspdf:前端
(1)npm install --save html2canvas(將頁面html轉換成圖片)vue
(2)npm install --save jspdf(將圖片生成pdf)java
建立一個htmlToPdf.js文件在指定位置內容以下:git
// 導出頁面爲PDF格式 import html2canvas from 'html2canvas' import JSPDF from 'jspdf' export default { install(Vue, options) { Vue.prototype.ExportSavePdf = function (htmlTitle, currentTime) { var element = document.getElementById('pdfContent') html2canvas(element, { logging: false }).then(function (canvas) { var pdf = new JSPDF('p', 'mm', 'a4') // A4紙,縱向 var ctx = canvas.getContext('2d') var a4w = 170; var a4h = 257 // A4大小,210mm x 297mm,四邊各保留20mm的邊距,顯示區域170x257 var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4顯示比例換算一頁圖像的像素高度 var renderedHeight = 0 while (renderedHeight < canvas.height) { var page = document.createElement('canvas') page.width = canvas.width page.height = Math.min(imgHeight, canvas.height - renderedHeight) // 可能內容不足一頁 // 用getImageData剪裁指定區域,並畫到前面建立的canvas對象中 page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0) pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加圖像到頁面,保留10mm邊距 renderedHeight += imgHeight if (renderedHeight < canvas.height) { pdf.addPage() } // 若是後面還有內容,添加一個空頁 // delete page; } pdf.save(htmlTitle + currentTime) }) } } } 複製代碼
接下來咱們須要把上面實現的插件安裝到Vue中: 在main.js中安裝插件github
import htmlToPdf from '@/components/utils/htmlToPdf' Vue.use(htmlToPdf) 複製代碼
定義好要轉換的dom容器,而後直接調用ExportSavePdf函數,傳入參數便可:npm
<template>
<div>
<div ref="pdfContent" id="pdfContent">
<el-table :data="tableData" border style="width: 100%">
<el-table-column fixed prop="date" label="日期" width="150"></el-table-column>
<el-table-column prop="name" label="姓名" width="120"></el-table-column>
<el-table-column prop="province" label="省份" width="120"></el-table-column>
<el-table-column prop="city" label="市區" width="120"></el-table-column>
<el-table-column prop="address" label="地址" width="300"></el-table-column>
<el-table-column prop="zip" label="郵編" width="120"></el-table-column>
<el-table-column fixed="right" label="操做" width="100">
<template slot-scope="scope">
<el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
<el-button type="text" size="small">編輯</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-button type="danger" @click="ExportSavePdf()">導出PDF</el-button>
</div>
</template>
<script>
import html2canvas from 'html2canvas'
import JSPDF from 'jspdf'
export default {
methods: {
handleClick(row) {
console.log(row)
},
},
data() {
return {
htmlTitle: 'PDF名稱',
nowTime: '',
tableData: [
{
date: '2016-05-03',
name: '王小虎',
province: '上海',
city: '普陀區',
address: '上海市普陀區金沙江路 1518 弄',
zip: 200333,
},
{
date: '2016-05-02',
name: '王小虎',
province: '上海',
city: '普陀區',
address: '上海市普陀區金沙江路 1518 弄',
zip: 200333,
},
{
date: '2016-05-04',
name: '王小虎',
province: '上海',
city: '普陀區',
address: '上海市普陀區金沙江路 1518 弄',
zip: 200333,
},
{
date: '2016-05-01',
name: '王小虎',
province: '上海',
city: '普陀區',
address: '上海市普陀區金沙江路 1518 弄',
zip: 200333,
},
],
}
},
}
</script>
複製代碼