使用vue3-print-nb實(shí)現(xiàn)打印pdf分頁(yè)代碼示例
安裝插件
npm install vue3-print-nb --save
vue3 引入
import print from 'vue3-print-nb' // 打印插件 app.use(print)
使用
這里使用的是對(duì)象配置方式
對(duì)象配置方式——在js中定義一個(gè)對(duì)象,對(duì)象中可配置打印區(qū)域相關(guān)屬性,在需要打印的單據(jù)內(nèi)容最外面的div設(shè)置唯一的id,id值為js對(duì)象中的id值,在打印彈框里的打印按鈕設(shè)置自定義屬性v-print,該屬性值為打印區(qū)域的對(duì)象
<a-button type="primary" @click="printing" v-print="printObj">打印</a-button>
const printObj = {
id: "mypdf", // 這里是要打印元素的ID
popTitle: " ", // 打印的標(biāo)題
extraCss: "", // 打印可引入外部的一個(gè) css 文件
extraHead: "", // 打印頭部文字
preview: false, // 是否啟動(dòng)預(yù)覽模式,默認(rèn)是false
previewTitle: '中銅國(guó)際貿(mào)易集團(tuán)有限公司', // 打印預(yù)覽的標(biāo)題
previewPrintBtnLabel: '預(yù)覽結(jié)束,開(kāi)始打印', // 打印預(yù)覽的標(biāo)題下方的按鈕文本,點(diǎn)擊可進(jìn)入打印
zIndex: 10002, // 預(yù)覽窗口的z-index,默認(rèn)是20002,最好比默認(rèn)值更高
previewBeforeOpenCallback() {
console.log('正在加載預(yù)覽窗口!')
},
previewOpenCallback() { console.log('已經(jīng)加載完預(yù)覽窗口,預(yù)覽打開(kāi)了!') }, // 預(yù)覽窗口打開(kāi)時(shí)的callback
beforeOpenCallback() {
console.log('開(kāi)始打印之前!')
}, // 開(kāi)始打印之前的callback
openCallback() {
console.log('執(zhí)行打印了!')
}, // 調(diào)用打印時(shí)的callback
closeCallback() { console.log('關(guān)閉了打印工具!') }, // 關(guān)閉打印的callback(無(wú)法區(qū)分確認(rèn)or取消)
clickMounted() {
console.log('點(diǎn)擊v-print綁定的按鈕了')
},
}
分頁(yè)分為倆種情況
第一種:打印單據(jù)有2個(gè)以上,打印時(shí)需要自動(dòng)分頁(yè)打印,且每一頁(yè)內(nèi)容不超出一頁(yè)(固定的數(shù)據(jù))
單據(jù)內(nèi)容的最外層的div設(shè)置樣式page-break-before:always,即可在打印時(shí)自動(dòng)分頁(yè)
@media print {
.section {
page-break-before: always;
/* 在每個(gè)部分之前始終開(kāi)始新頁(yè)面 */
// margin: 20px 0; /* 為了使打印頁(yè)面更清晰,可以添加一些上下間距 */
margin-top: 0;
}
}
第二種:打印單據(jù)有2個(gè)以上,打印時(shí)需要自動(dòng)分頁(yè)打印,內(nèi)容連續(xù)且不固定,
如圖所示打印 一行被截?cái)?不滿足需求

自動(dòng)分頁(yè) : 有兩個(gè)高度需要區(qū)分,一個(gè)是html頁(yè)面的實(shí)際高度,和生成pdf的頁(yè)面高度,
當(dāng)內(nèi)容未超過(guò)pdf一頁(yè)顯示的范圍,無(wú)需分頁(yè)
通過(guò)class="paging"的容器進(jìn)行分割,考慮到每張A4紙高度固定,所以通過(guò)判斷每個(gè)class為paging的容器高度累加,大于紙張高度時(shí),就給上一個(gè)class為paging的容器加上style=“page-break-pageBreakBefore:always”
// 動(dòng)態(tài)計(jì)算 分頁(yè)
const PAGE_HEIGHT = 1100 // A4紙高度
const printing = () => {
const splitDoms = document.getElementsByClassName('paging')
console.log(splitDoms)
let startY = 0 // 占用A4紙的高度,從每頁(yè)第一個(gè)poetry div的top值開(kāi)始累加
for (let i = 0; i < splitDoms.length; i++) {
const splitDom = splitDoms[i]
const splitValue = splitDom.getBoundingClientRect()
console.log(splitDom.getBoundingClientRect())
if (startY === 0) {
startY = splitValue.top
}
const pageHeight = splitValue.bottom - startY
// 當(dāng)加上當(dāng)前div的高度大于A4紙高度時(shí),給前一個(gè)div加上分頁(yè)標(biāo)識(shí)
if (pageHeight > PAGE_HEIGHT) {
console.log(i)
startY = 0
if (i > 0) {
splitDoms[i - 1].style.pageBreakBefore = 'always'; // 給前一個(gè)元素添加分頁(yè)符
}
}
}
}
動(dòng)態(tài)計(jì)算后的分頁(yè)展示

打印功能完整代碼(安裝好包,導(dǎo)入包后,可直接復(fù)制粘貼使用)
<template>
<div>
<a-button type="primary" style="margin-right: 10px;" @click="printing" v-print="printObj">打印</a-button>
<!-- <a-button type="primary" style="margin-right: 10px;" @click="downPdf">下載PDF</a-button> -->
</div>
<div style="overflow-y: auto;padding: 20px;">
<div class="main" id="mypdf">
<div class="title fd">客商評(píng)價(jià)明細(xì)表</div>
<div class="fd">
供應(yīng)商名稱: <span>xxxxxxxxxxxxxxxxxxx</span> 編號(hào):xxxxxxxxxxxxxxxxx
</div>
<table border="1" class="techniques" style="margin-top: 1px;width: 100%;">
<tr>
<td style="width: 130px;text-align: center;">擬開(kāi)展業(yè)務(wù)</td>
<td colspan="3">xxxxxxxxxxxxxxxxxxxxxx</td>
<td class="tec" :colspan="5">評(píng)價(jià)明細(xì)情況</td>
</tr>
<tr>
<!-- <td style="width: 130px;text-align: center;">因素</td> -->
<td style="width: 130px;text-align: center;">主要指標(biāo)</td>
<td style="width: 100px;text-align: center;">指標(biāo)類型</td>
<td style="width: 150px;">評(píng)分標(biāo)準(zhǔn)</td>
<td style="width: 100px" class="tec">標(biāo)準(zhǔn)分?jǐn)?shù)</td>
<td v-for="item in 5" class="tec">姓名{{ item }}</td>
</tr>
<tbody v-for="item in baseList" class="paging" style="height: 1px;">
<tr>
<!-- <td style="width: 130px;text-align: center;">{{ item.factor }}</td> -->
<td style="width: 130px;text-align: center;">{{ item.factor }}</td>
<td style="width: 100px;text-align: center;">否決項(xiàng)</td>
<td>{{ item.scoringcriteria }}</td>
<td style="width: 100px;text-align: center;">
<div style="display: flex;">
<div style="display: flex; align-items: center;">
<div class="tag">
<!-- <check-outlined class="tagIcon" /> -->
</div>
<div>是</div>
</div>
<div style="display: flex; align-items: center;">
<div class="tag">
<!-- <check-outlined class="tagIcon" /> -->
</div>
<div>否</div>
</div>
</div>
</td>
<td v-for="item in item.peo" class="tec">{{ item }}</td>
</tr>
</tbody>
<tbody v-for="item in orditemLsit" :key="item.id" class="paging">
<tr v-for="(val, index) in item.scoringcriteria" :key="val.id">
<td style="width: 130px;text-align: center;" v-if="index === 0"
:rowspan="item.scoringcriteria.length">
{{ item.factor }}
</td>
<td style="width: 100px;text-align: center;" v-if="index === 0"
:rowspan="item.scoringcriteria.length">
5
</td>
<td style="width: 130px;">{{ val.title }}</td>
<td style="width: 100px;" class="tec">{{ val.score }}</td>
<template v-for="items in 5">
<td class="tec" v-if="index === 0" :rowspan="item.scoringcriteria.length">{{ items }}</td>
</template>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script setup>
let baseList = [
{
factor: '公司及董監(jiān)高失信',
mainindex: '公司及董監(jiān)高是否被列為失信執(zhí)行人員',
score: '否決項(xiàng)',
scoringcriteria: '公司及董監(jiān)高被列為失信執(zhí)行人員',
standardScore: '',
peo: 5
},
{
factor: '成立年限',
mainindex: '成立年限',
score: '否決項(xiàng)',
scoringcriteria: '公司成立年限小于3年',
standardScore: '',
peo: 5
},
{
factor: '信用評(píng)價(jià)',
mainindex: '第三方征信系統(tǒng)的評(píng)級(jí)',
score: '否決項(xiàng)',
scoringcriteria: '償債能力預(yù)警(對(duì)應(yīng)征信報(bào)告的第4級(jí)),如無(wú)第三方征信報(bào)告,則可從客商資產(chǎn)質(zhì)量、資產(chǎn)負(fù)債率、營(yíng)運(yùn)管理、競(jìng)爭(zhēng)力情況等方面進(jìn)行綜合評(píng)價(jià),如資產(chǎn)質(zhì)量較差,償債能力較差,或存在大量訴訟案件或最近2年有重大行政處罰記錄,需警惕',
standardScore: '',
peo: 5
},
{
factor: '凈資產(chǎn)',
mainindex: '最新年度或半年度凈資產(chǎn)',
score: '否決項(xiàng)',
scoringcriteria: '最新年度或半年度凈資產(chǎn)總額小于500萬(wàn)元',
standardScore: '',
peo: 5
},
{
factor: '業(yè)務(wù)范圍',
mainindex: '業(yè)務(wù)范圍',
score: '否決項(xiàng)',
scoringcriteria: '有與公司同類自營(yíng)貿(mào)易業(yè)務(wù)的民營(yíng)企業(yè)',
standardScore: '',
peo: 5
},
{
factor: '經(jīng)營(yíng)性現(xiàn)金凈流量',
mainindex: '經(jīng)營(yíng)性現(xiàn)金凈流量',
score: '否決項(xiàng)',
scoringcriteria: '連續(xù)三年經(jīng)營(yíng)性現(xiàn)金凈流量為負(fù)',
standardScore: '',
peo: 5
},
{
factor: '所有者權(quán)益與實(shí)收資本關(guān)系',
mainindex: '所有者權(quán)益與實(shí)收資本關(guān)系',
score: '否決項(xiàng)',
scoringcriteria: '所有者權(quán)益總額連續(xù)三年小于實(shí)收資本金額',
standardScore: '',
peo: 5
},
{
factor: '境內(nèi)供應(yīng)商未提供最近三年審計(jì)報(bào)告',
mainindex: '境內(nèi)供應(yīng)商未提供最近三年審計(jì)報(bào)告',
score: '否決項(xiàng)',
scoringcriteria: '境內(nèi)供應(yīng)商未提供最近三年審計(jì)報(bào)告',
standardScore: '',
peo: 5
},
]
let orditemLsit = [
{
factor: '成立年限',
score: '5',
scoringcriteria: [
{
title: '成立年限5年(含)以上',
score: '5'
},
{
title: '成立年限3年(含)至5年',
score: '3'
},
{
title: '成立年限3年(不含)以下',
score: '1'
},
],
standardScore: '',
peo: 5
},
{
factor: '實(shí)繳注冊(cè)資本金',
score: '5',
scoringcriteria: [
{
title: '8000萬(wàn)元(含) 以上 ',
score: '5'
},
{
title: '4000萬(wàn)元(含) 至8000萬(wàn)元 ',
score: '4'
},
{
title: '1000萬(wàn)元(含) 至4000萬(wàn)元 ',
score: '3'
},
{
title: '1000萬(wàn)元(不含)以下至4000萬(wàn)元 ',
score: '1'
},
],
standardScore: '',
peo: 5
},
{
factor: '企業(yè)性質(zhì)',
score: '5',
scoringcriteria: [
{
title: '國(guó)有A股上市,央企三級(jí)以上公司 以上 ',
score: '5'
},
{
title: '上市公司,省屬大型國(guó)企',
score: '4'
},
{
title: '國(guó)有非上市',
score: '3'
},
{
title: '其它(非國(guó)企、非上市)',
score: '1'
},
],
standardScore: '',
peo: 5
},
{
factor: '企業(yè)性質(zhì)',
score: '5',
scoringcriteria: [
{
title: '國(guó)有A股上市,央企三級(jí)以上公司 以上 ',
score: '5'
},
{
title: '上市公司,省屬大型國(guó)企',
score: '4'
},
{
title: '國(guó)有非上市',
score: '3'
},
{
title: '其它(非國(guó)企、非上市)',
score: '1'
},
],
standardScore: '',
peo: 5
},
{
factor: '企業(yè)性質(zhì)',
score: '5',
scoringcriteria: [
{
title: '國(guó)有A股上市,央企三級(jí)以上公司 以上 ',
score: '5'
},
{
title: '上市公司,省屬大型國(guó)企',
score: '4'
},
{
title: '國(guó)有非上市',
score: '3'
},
{
title: '其它(非國(guó)企、非上市)',
score: '1'
},
],
standardScore: '',
peo: 5
},
]
const printObj = {
id: "mypdf", // 這里是要打印元素的ID
popTitle: " ", // 打印的標(biāo)題
extraCss: "", // 打印可引入外部的一個(gè) css 文件
extraHead: "", // 打印頭部文字
preview: false, // 是否啟動(dòng)預(yù)覽模式,默認(rèn)是false
previewTitle: '中銅國(guó)際貿(mào)易集團(tuán)有限公司', // 打印預(yù)覽的標(biāo)題
previewPrintBtnLabel: '預(yù)覽結(jié)束,開(kāi)始打印', // 打印預(yù)覽的標(biāo)題下方的按鈕文本,點(diǎn)擊可進(jìn)入打印
zIndex: 10002, // 預(yù)覽窗口的z-index,默認(rèn)是20002,最好比默認(rèn)值更高
previewBeforeOpenCallback() {
console.log('正在加載預(yù)覽窗口!')
},
previewOpenCallback() { console.log('已經(jīng)加載完預(yù)覽窗口,預(yù)覽打開(kāi)了!') }, // 預(yù)覽窗口打開(kāi)時(shí)的callback
beforeOpenCallback() {
console.log('開(kāi)始打印之前!')
}, // 開(kāi)始打印之前的callback
openCallback() {
console.log('執(zhí)行打印了!')
}, // 調(diào)用打印時(shí)的callback
closeCallback() { console.log('關(guān)閉了打印工具!') }, // 關(guān)閉打印的callback(無(wú)法區(qū)分確認(rèn)or取消)
clickMounted() {
console.log('點(diǎn)擊v-print綁定的按鈕了')
},
}
const PAGE_HEIGHT = 1100 // A4紙高度
const printing = () => {
const splitDoms = document.getElementsByClassName('paging')
console.log(splitDoms)
let startY = 0 // 占用A4紙的高度,從每頁(yè)第一個(gè)poetry div的top值開(kāi)始累加
for (let i = 0; i < splitDoms.length; i++) {
const splitDom = splitDoms[i]
const splitValue = splitDom.getBoundingClientRect()
console.log(splitDom.getBoundingClientRect())
if (startY === 0) {
startY = splitValue.top
}
const pageHeight = splitValue.bottom - startY
// 當(dāng)加上當(dāng)前div的高度大于A4紙高度時(shí),給前一個(gè)div加上分頁(yè)標(biāo)識(shí)
if (pageHeight > PAGE_HEIGHT) {
console.log(i)
startY = 0
if (i > 0) {
splitDoms[i - 1].style.pageBreakBefore = 'always'; // 給前一個(gè)元素添加分頁(yè)符
}
}
}
}
</script>
<style lang="scss" scoped>
.main {
width: 900px;
margin: 0 auto;
}
.title {
font-size: 19px;
margin-bottom: 10px;
line-height: 33px;
text-align: center;
}
.techniques {
width: 100%;
border-color: #000;
font-family: "宋體", "SimSun", sans-serif;
}
.techniques,
.techniques th,
.techniques td {
border-collapse: collapse;
line-height: 22px;
font-size: 13px
}
.fd {
font-weight: bold;
}
.tec {
text-align: center;
}
.tag {
width: 14px;
height: 14px;
border-radius: 2px;
text-align: center;
color: #fff;
border: 1px solid #333;
font-weight: 700;
// margin-left: 10px;
// margin-right: -10px;
margin: 0 5px;
position: relative;
.tagIcon {
position: absolute;
font-size: 12px;
top: 1px;
left: -20px;
z-index: 111;
color: #000;
}
}
@page {
size: auto A4 landscape;
margin-top: 20mm;
}
@media print {
.section {
page-break-before: always;
/* 在每個(gè)部分之前始終開(kāi)始新頁(yè)面 */
// margin: 20px 0; /* 為了使打印頁(yè)面更清晰,可以添加一些上下間距 */
margin-top: 0;
}
}
</style>總結(jié)
到此這篇關(guān)于使用vue3-print-nb實(shí)現(xiàn)打印pdf分頁(yè)的文章就介紹到這了,更多相關(guān)vue3-print-nb打印pdf分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+Element-UI中el-table動(dòng)態(tài)合并單元格:span-method方法代碼詳解
el-table是element-ui提供的表格組件,可以用于展示和操作數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于Vue+Element-UI中el-table動(dòng)態(tài)合并單元格:span-method方法的相關(guān)資料,需要的朋友可以參考下2023-09-09
使用Vue+Django+Ant Design做一個(gè)留言評(píng)論模塊的示例代碼
這篇文章主要介紹了使用Vue+Django+Ant Design做一個(gè)留言評(píng)論模塊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
vite項(xiàng)目配置less全局樣式的實(shí)現(xiàn)步驟
最近想實(shí)現(xiàn)個(gè)項(xiàng)目,需要配置全局less,本文主要介紹了vite項(xiàng)目配置less全局樣式的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
基于vue框架手寫(xiě)一個(gè)notify插件實(shí)現(xiàn)通知功能的方法
這篇文章主要介紹了基于vue框架手寫(xiě)一個(gè)notify插件實(shí)現(xiàn)通知功能的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
利用vue實(shí)現(xiàn)密碼輸入框/驗(yàn)證碼輸入框
這篇文章主要為大家詳細(xì)介紹了如何利用vue實(shí)現(xiàn)密碼輸入框或驗(yàn)證碼輸入框的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-08-08
Vue自定義組件雙向綁定實(shí)現(xiàn)原理及方法詳解
這篇文章主要介紹了Vue自定義組件雙向綁定實(shí)現(xiàn)原理及方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

