前端printjs的使用實(shí)戰(zhàn)案例
一、下載
1.使用 npm 進(jìn)行安裝
npm install print-js --save
2.使用 yarn 安裝
yarn add print-js
3.導(dǎo)入
import print from 'print-js'
二、案例
1、打印HTML
<button @click="printer">打印</button> <div id="printContent"> <!-- 需要打印的內(nèi)容 --> 123 </div> <script> import printJS from 'print-js'; const printer = () =>{ printJS({ printable: '#printContent', type: 'html', }); } </script>
2.打印Json
<button @click="printer">打印</button> <script> import printJS from 'print-js'; const printer = () =>{ printJS({ printable:[ { date:"2008-08-08", name:"賽麗亞", intensify:"429" }, { date:"2012-12-12", name:"派蒙", intensify:"648" }, ], properties: [ //表頭 {field: 'date', displayName: '日期', }, {field: 'name', displayName: '姓名', }, {field: 'intensify', displayName: '變強(qiáng)', }, ], type: 'json', header:"人員名單", headerStyle:"text-align: center;font-weight: bold;", documentTitle:"", gridHeaderStyle: 'border: 1px solid #000;text-align:center', gridStyle: 'border: 1px solid #000;text-align:center', repeatTableHeader:true }) } </script>
3.打印圖片
<button @click="printer">打印</button> <script> import printJS from 'print-js'; const printer = () =>{ printJS({ printable: [ 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg' ], type: 'image', header: 'Multiple Images', imageStyle: 'width:50%;margin-bottom:20px;' }) } </script>
三、配置項(xiàng)
屬性 | 默認(rèn)值 | 描述 |
printable | null | 文檔來源:pdf 或圖像 url、html 元素 id 或 json 數(shù)據(jù)對象。 |
type | 'pdf' | 可打印類型??捎玫拇蛴∵x項(xiàng)包括:pdf、html、image、json 和 raw-html。 |
header | null | 用于 HTML、圖像或 JSON 打印的可選標(biāo)題。它將放置在頁面頂部。此屬性將接受文本或原始 HTML。 |
headerStyle | 'font-weight: 300;' | 要應(yīng)用于頁眉文本的可選頁眉樣式。 |
maxWidth | 800 | 最大文檔寬度(以像素為單位)。根據(jù)需要更改此設(shè)置。打印 HTML、圖像或 JSON 時使用。 |
css | null | 這允許我們傳遞一個或多個 css 文件 URL,這些 URL 應(yīng)該應(yīng)用于正在打印的 html。值可以是具有單個 URL 的字符串,也可以是具有多個 URL 的數(shù)組。 |
style | null | 這允許我們傳遞一個具有自定義樣式的字符串,該字符串應(yīng)應(yīng)用于正在打印的 html。 |
scanStyles | true | 設(shè)置為 false 時,庫將不處理應(yīng)用于正在打印的 html 的樣式。使用參數(shù)時很有用。 |
targetStyle | null | 默認(rèn)情況下,庫在打印 HTML 元素時僅處理某些樣式。此選項(xiàng)允許您傳遞要處理的樣式數(shù)組。例如: ['padding-top', 'border-bottom'] |
targetStyles | null | 但是,與“targetStyle”相同,這將處理任何一系列樣式。例如:['border', 'padding'],將包括 'border-bottom'、'border-top'、'border-left'、'border-right'、'padding-top' 等。 您還可以傳遞 ['*'] 來處理所有樣式。 |
ignoreElements | [] | 接受打印父 html 元素時應(yīng)忽略的 html ID 數(shù)組。 |
properties | null | 打印 JSON 時使用。這些是對象屬性名稱。 |
gridHeaderStyle | 'font-weight: bold;' | 打印 JSON 數(shù)據(jù)時網(wǎng)格標(biāo)頭的可選樣式。 |
gridStyle | 'border: 1px solid lightgray; margin-bottom: -1px;' | 打印 JSON 數(shù)據(jù)時網(wǎng)格行的可選樣式。 |
repeatTableHeader | true | 打印 JSON 數(shù)據(jù)時使用。設(shè)置為 時,數(shù)據(jù)表標(biāo)題將僅顯示在第一頁中。 |
showModal | null | 啟用此選項(xiàng)可在檢索或處理大型 PDF 文件時顯示用戶反饋。 |
modalMessage | 'Retrieving Document...' | 設(shè)置為 時向用戶顯示的消息。 |
onLoadingStart | null | 加載 PDF 時要執(zhí)行的功能 |
onLoadingEnd | null | 加載 PDF 后要執(zhí)行的功能 |
documentTitle | 'Document' | 打印 html、image 或 json 時,這將顯示為文檔標(biāo)題。 |
fallbackPrintable | null | 打印 pdf 時,如果瀏覽器不兼容(檢查瀏覽器兼容性表),庫將在新選項(xiàng)卡中打開 pdf。這允許您傳遞要打開的不同 pdf 文檔,而不是在“可打印”中傳遞的原始文檔。如果您在備用 pdf 文件中注入 javascript,這可能很有用。 |
onPdfOpen | null | 打印 pdf 時,如果瀏覽器不兼容(檢查瀏覽器兼容性表),庫將在新選項(xiàng)卡中打開 pdf??梢栽诖颂巶鬟f回調(diào)函數(shù),當(dāng)發(fā)生這種情況時將執(zhí)行該函數(shù)。在某些情況下,當(dāng)您想要處理打印流程、更新用戶界面等時,它可能很有用。 |
onPrintDialogClose | null | 關(guān)閉瀏覽器打印對話框后執(zhí)行回調(diào)函數(shù)。 |
onError | error => throw error | 發(fā)生錯誤時要執(zhí)行的回調(diào)函數(shù)。 |
base64 | false | 打印作為 base64 數(shù)據(jù)傳遞的 PDF 文檔時使用。 |
honorMarginPadding (已棄用) | true | 這用于保留或刪除正在打印的元素的填充和邊距。有時這些樣式設(shè)置在屏幕上很棒,但在打印時看起來很糟糕。您可以通過將其設(shè)置為 false 來刪除它。 |
honorColor (已棄用) | false | 若要打印彩色文本,請將此屬性設(shè)置為 true。默認(rèn)情況下,所有文本都將以黑色打印。 |
font (已棄用) | 'TimesNewRoman' | 打印 HTML 或 JSON 時使用的字體。 |
font_size (已棄用) | '12pt' | 打印 HTML 或 JSON 時使用的字體大小。 |
imageStyle (已棄用) | 'width:100%;' | 打印圖像時使用。接受要應(yīng)用于每個圖像的具有自定義樣式的字符串。 |
附:使用print-js開發(fā)打印功能,解決不同分辨率設(shè)備打印時適配的問題
近期開發(fā)了一張報表,功能有打印,是好開發(fā)的;可是不同設(shè)備分辨率打印時并不適配。
網(wǎng)上查找搜尋未果,經(jīng)過經(jīng)理的提點(diǎn)和自己的探索和嘗試,最終解決了這一令人頭疼的問題。
特此記錄,并把這個方法和思維分享給遇到這個問題查找無果的愛學(xué)習(xí)愛鼓搗辛勤工作的讀者們。
問題描述:
筆者在開發(fā)時按照本PC機(jī)的分辨率進(jìn)行打印調(diào)整;所以在當(dāng)前電腦上打印是沒有任何問題的。
只是換了一臺設(shè)備后,分辨率不同了,打印樣式會被破壞;
在開發(fā)環(huán)境中引入 print-js 的博文很多,且都很不錯,在此就不再贅述了。直接上代碼!
需要打印的表體部分如下;注意這里為打印定義了一個id="printTable";適配時用到id="rootDiv";
<div id="rootDiv"> <el-button type="primary" @click="handlePrint">打印表格</el-button> <el-table :data="tabData" border :cell-style="{'text-align':'center'}" :header-cell-style="{'text-align':'center'}" :row-style="{ height: '84px' }" id="printTable" > <el-table-column label="編號" prop="ordNum1" width="80"/> <el-table-column label="會計科目" prop="ledgerAcc1" width=""/> <el-table-column label="年初數(shù)" prop="beginBalance1" width=""/> <el-table-column label="期末數(shù)" prop="closeBalance1" width=""/> <el-table-column label="編號" prop="ordNum2" width="80"/> <el-table-column label="會計科目" prop="ledgerAcc2" width=""/> <el-table-column label="年初數(shù)" prop="beginBalance2" width=""/> <el-table-column label="期末數(shù)" prop="closeBalance2" width=""/> </el-table> </div>
定義打印頂部模板,打印樣式,打印功能;
打印時的樣式,如果分辨率和筆者不同,
可以設(shè)置打印時 CSS 樣式的縮放 zoom, 邊距 margin;
或者 printJS 函數(shù)中參數(shù)的對象屬性 font_size 等來調(diào)整;
還可以在el-table-column標(biāo)簽中通過調(diào)整width大小表體列寬來適配;
請讀者仔細(xì)耐心瀏覽閱讀handlePrint()函數(shù);筆者在里面做了詳細(xì)的注釋和解釋,并進(jìn)行了排版;
data(){ return{ // 打印時的樣式,如果分辨率和筆者不同,可以設(shè)置打印時的縮放,邊距,字體大小等來調(diào)整; // 還可以通過調(diào)整表體列寬來適配; printStyle: ` @page { /* size:auto; */ margin-top:90px; margin-left:20px; /* 設(shè)置打印頁面的左邊距 */ margin-right:20px; } thead th { border-top: 1px solid #000; border-right: 1px solid #000; border-left: 1px solid #000; } tbody td { /* height: 32px; line-height: 36px; */ border: 1px solid #000; } body { zoom: 50%; /* 設(shè)置打印時的縮放 */ } tbody { border: 1px solid #ff0000; // border: solid 1px red; /* color: green; *//*設(shè)置字體顏色*/ height: 36px; line-height: 26px; text-align: center; vertical-align: middle; // font_size: 100pt; /* font-family:'宋體'; */ /* color: green; */ // font_size: 28pt; } table { // color: red; // line-height: 36px; border-collapse: collapse; } `, // 打印時的頂部模板; topHtml: ` <h2 style="text-align: center;width:227%;">食堂-資產(chǎn)負(fù)債表</h2> <div style="text-align:center;margin: 10px auto;font-size:80%; width:227%;display: flex;flex-direction:row-reverse;"> <div style="margin-right: 20px;margin-left: 10px;">金額單位:元</div> <div style="margin-right: 20px;">日期:2023-11</div> <div style="margin-right: 20px;">單位名稱:XXXX幼兒園</div> </div> `, // 表格數(shù)據(jù); tableData: [ { beginBalance1 : 'xxx58.32', beginBalance2 : 'xxx242', closeBalance1 : 'xxx655.63', closeBalance2 : 'xxx30', ledgerAcc1 : '一.資產(chǎn)類小計', ledgerAcc2 : '二.負(fù)債類小計', ordNum1 : '-', ordNum2 : '-' }, { beginBalance1 : 'xx716.24', beginBalance2 : 'x80', closeBalance1 : 'xx786.59', closeBalance2 : 'x80', ledgerAcc1 : '銀行存款', ledgerAcc2 : '應(yīng)付賬款', ordNum1 : '1', ordNum2 : '8', } ] } }, methods: { handlePrint() { let rootDiv = document.getElementById('rootDiv') // 適配打印時的分辨率, 請讀者根據(jù)自己的PC,在此設(shè)置不同的分辨率 rootDiv.style.height = '1200px' rootDiv.style.width = '1920px' /* 這里做的比較巧妙和不容易想到的是,在打印之前將所有的設(shè)備分辨率改變?yōu)殚_發(fā)者電腦的分辨率, 打印完成之后,又恢復(fù)為用戶默認(rèn)的分辨率;這樣就不用一一去考慮機(jī)型了; */ // 定義了分辨率,當(dāng)前縮放與布局就不需要設(shè)置和調(diào)整了; let userAgent = navigator.userAgent //判斷是否Chrome瀏覽器 if (userAgent.indexOf('Chrome') > -1) { console.log('Chrome') /* 這里使用了setTimeout,讀者一定要注意給打印設(shè)置時間; 當(dāng)前筆者設(shè)置了50毫秒的延時時間; 將打印放入了延時隊(duì)列,不然printJS立即執(zhí)行打印; 而頁面分辨率還未適配成功,導(dǎo)致打印樣式適配失敗; 這樣做給當(dāng)前的頁面適配分辨率渲染預(yù)留了足夠的時間; */ setTimeout(() => { printJS({ printable: 'printTable', // 標(biāo)簽元素id,表體; // maxWidth: 1150, // 最大寬度 font_size: '26pt', // 設(shè)置打印時字體大小 type: 'html', header: this.topHtml, // 打印頂部模板 documentTitle: '', style: this.printStyle // 打印樣式 }) // 打印完之后 恢復(fù)默認(rèn)分辨率 // rootDiv.style.height = window.screen.height + 'px' // rootDiv.style.width = window.screen.width + 'px' // 使用相對單位,這樣不會出現(xiàn)滾動條; rootDiv.style.height = 'auto' rootDiv.style.width = '100%' }, 50) } }, }
如下圖,改變本機(jī)分辨率之后的打印顯示;
總結(jié)
到此這篇關(guān)于前端printjs使用的文章就介紹到這了,更多相關(guān)printjs使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS焦點(diǎn)圖,JS 多個頁面放多個焦點(diǎn)圖的實(shí)例
下面小編就為大家?guī)硪黄狫S焦點(diǎn)圖,JS 多個頁面放多個焦點(diǎn)圖的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12js實(shí)現(xiàn)不提交表單獲取單選按鈕值的方法
這篇文章主要介紹了js實(shí)現(xiàn)不提交表單獲取單選按鈕值的方法,涉及javascript鼠標(biāo)事件及頁面元素屬性操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08關(guān)于meta viewport中target-densitydpi屬性詳解(推薦)
這篇文章主要介紹了關(guān)于meta viewport中target-densitydpi屬性詳解,通過不同的縮放比例實(shí)現(xiàn)了不同的預(yù)覽效果,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08js操作CheckBoxList實(shí)現(xiàn)全選/反選(在客服端完成)
對于CheckBoxList控件來說,一方面要實(shí)現(xiàn)大量數(shù)據(jù)在服務(wù)器端的綁定工作,另一方面往往要求實(shí)現(xiàn)全選、反選等功能,接下來將介紹js操作CheckBoxList實(shí)現(xiàn)全選/反選,感興趣的朋友可以了解下,或許對你有所幫助2013-02-02JS實(shí)現(xiàn)線性表的順序表示方法示例【經(jīng)典數(shù)據(jù)結(jié)構(gòu)】
這篇文章主要介紹了JS實(shí)現(xiàn)線性表的順序表示方法,簡單分析了線性表的原理并結(jié)合實(shí)例形式給出了線性表的插入與刪除實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04JavaScript實(shí)現(xiàn)url參數(shù)轉(zhuǎn)成json形式
這篇文章主要介紹了JavaScript實(shí)現(xiàn)url參數(shù)轉(zhuǎn)成json形式的相關(guān)代碼,有喜歡的小伙伴可以參考下2016-09-09