前端printjs的使用實戰(zhàn)案例
一、下載
1.使用 npm 進行安裝
npm install print-js --save
2.使用 yarn 安裝
yarn add print-js
3.導入
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: '變強', },
],
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>三、配置項
| 屬性 | 默認值 | 描述 |
| printable | null | 文檔來源:pdf 或圖像 url、html 元素 id 或 json 數(shù)據(jù)對象。 |
| type | 'pdf' | 可打印類型??捎玫拇蛴∵x項包括:pdf、html、image、json 和 raw-html。 |
| header | null | 用于 HTML、圖像或 JSON 打印的可選標題。它將放置在頁面頂部。此屬性將接受文本或原始 HTML。 |
headerStyle | 'font-weight: 300;' | 要應用于頁眉文本的可選頁眉樣式。 |
| maxWidth | 800 | 最大文檔寬度(以像素為單位)。根據(jù)需要更改此設置。打印 HTML、圖像或 JSON 時使用。 |
| css | null | 這允許我們傳遞一個或多個 css 文件 URL,這些 URL 應該應用于正在打印的 html。值可以是具有單個 URL 的字符串,也可以是具有多個 URL 的數(shù)組。 |
| style | null | 這允許我們傳遞一個具有自定義樣式的字符串,該字符串應應用于正在打印的 html。 |
| scanStyles | true | 設置為 false 時,庫將不處理應用于正在打印的 html 的樣式。使用參數(shù)時很有用。 |
| targetStyle | null | 默認情況下,庫在打印 HTML 元素時僅處理某些樣式。此選項允許您傳遞要處理的樣式數(shù)組。例如: ['padding-top', 'border-bottom'] |
| targetStyles | null | 但是,與“targetStyle”相同,這將處理任何一系列樣式。例如:['border', 'padding'],將包括 'border-bottom'、'border-top'、'border-left'、'border-right'、'padding-top' 等。 您還可以傳遞 ['*'] 來處理所有樣式。 |
| ignoreElements | [] | 接受打印父 html 元素時應忽略的 html ID 數(shù)組。 |
| properties | null | 打印 JSON 時使用。這些是對象屬性名稱。 |
| gridHeaderStyle | 'font-weight: bold;' | 打印 JSON 數(shù)據(jù)時網(wǎng)格標頭的可選樣式。 |
| gridStyle | 'border: 1px solid lightgray; margin-bottom: -1px;' | 打印 JSON 數(shù)據(jù)時網(wǎng)格行的可選樣式。 |
| repeatTableHeader | true | 打印 JSON 數(shù)據(jù)時使用。設置為 時,數(shù)據(jù)表標題將僅顯示在第一頁中。 |
| showModal | null | 啟用此選項可在檢索或處理大型 PDF 文件時顯示用戶反饋。 |
| modalMessage | 'Retrieving Document...' | 設置為 時向用戶顯示的消息。 |
| onLoadingStart | null | 加載 PDF 時要執(zhí)行的功能 |
| onLoadingEnd | null | 加載 PDF 后要執(zhí)行的功能 |
| documentTitle | 'Document' | 打印 html、image 或 json 時,這將顯示為文檔標題。 |
| fallbackPrintable | null | 打印 pdf 時,如果瀏覽器不兼容(檢查瀏覽器兼容性表),庫將在新選項卡中打開 pdf。這允許您傳遞要打開的不同 pdf 文檔,而不是在“可打印”中傳遞的原始文檔。如果您在備用 pdf 文件中注入 javascript,這可能很有用。 |
| onPdfOpen | null | 打印 pdf 時,如果瀏覽器不兼容(檢查瀏覽器兼容性表),庫將在新選項卡中打開 pdf??梢栽诖颂巶鬟f回調(diào)函數(shù),當發(fā)生這種情況時將執(zhí)行該函數(shù)。在某些情況下,當您想要處理打印流程、更新用戶界面等時,它可能很有用。 |
| onPrintDialogClose | null | 關閉瀏覽器打印對話框后執(zhí)行回調(diào)函數(shù)。 |
| onError | error => throw error | 發(fā)生錯誤時要執(zhí)行的回調(diào)函數(shù)。 |
| base64 | false | 打印作為 base64 數(shù)據(jù)傳遞的 PDF 文檔時使用。 |
| honorMarginPadding (已棄用) | true | 這用于保留或刪除正在打印的元素的填充和邊距。有時這些樣式設置在屏幕上很棒,但在打印時看起來很糟糕。您可以通過將其設置為 false 來刪除它。 |
| honorColor (已棄用) | false | 若要打印彩色文本,請將此屬性設置為 true。默認情況下,所有文本都將以黑色打印。 |
| font (已棄用) | 'TimesNewRoman' | 打印 HTML 或 JSON 時使用的字體。 |
| font_size (已棄用) | '12pt' | 打印 HTML 或 JSON 時使用的字體大小。 |
| imageStyle (已棄用) | 'width:100%;' | 打印圖像時使用。接受要應用于每個圖像的具有自定義樣式的字符串。 |
附:使用print-js開發(fā)打印功能,解決不同分辨率設備打印時適配的問題
近期開發(fā)了一張報表,功能有打印,是好開發(fā)的;可是不同設備分辨率打印時并不適配。
網(wǎng)上查找搜尋未果,經(jīng)過經(jīng)理的提點和自己的探索和嘗試,最終解決了這一令人頭疼的問題。
特此記錄,并把這個方法和思維分享給遇到這個問題查找無果的愛學習愛鼓搗辛勤工作的讀者們。
問題描述:
筆者在開發(fā)時按照本PC機的分辨率進行打印調(diào)整;所以在當前電腦上打印是沒有任何問題的。
只是換了一臺設備后,分辨率不同了,打印樣式會被破壞;

在開發(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>定義打印頂部模板,打印樣式,打印功能;
打印時的樣式,如果分辨率和筆者不同,
可以設置打印時 CSS 樣式的縮放 zoom, 邊距 margin;
或者 printJS 函數(shù)中參數(shù)的對象屬性 font_size 等來調(diào)整;
還可以在el-table-column標簽中通過調(diào)整width大小表體列寬來適配;
請讀者仔細耐心瀏覽閱讀handlePrint()函數(shù);筆者在里面做了詳細的注釋和解釋,并進行了排版;
data(){
return{
// 打印時的樣式,如果分辨率和筆者不同,可以設置打印時的縮放,邊距,字體大小等來調(diào)整;
// 還可以通過調(diào)整表體列寬來適配;
printStyle: `
@page {
/* size:auto; */
margin-top:90px;
margin-left:20px; /* 設置打印頁面的左邊距 */
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%; /* 設置打印時的縮放 */
}
tbody {
border: 1px solid #ff0000;
// border: solid 1px red;
/* color: green; *//*設置字體顏色*/
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)負債表</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 : '二.負債類小計',
ordNum1 : '-',
ordNum2 : '-'
},
{
beginBalance1 : 'xx716.24',
beginBalance2 : 'x80',
closeBalance1 : 'xx786.59',
closeBalance2 : 'x80',
ledgerAcc1 : '銀行存款',
ledgerAcc2 : '應付賬款',
ordNum1 : '1',
ordNum2 : '8',
}
]
}
},
methods: {
handlePrint() {
let rootDiv = document.getElementById('rootDiv')
// 適配打印時的分辨率, 請讀者根據(jù)自己的PC,在此設置不同的分辨率
rootDiv.style.height = '1200px'
rootDiv.style.width = '1920px'
/*
這里做的比較巧妙和不容易想到的是,在打印之前將所有的設備分辨率改變?yōu)殚_發(fā)者電腦的分辨率,
打印完成之后,又恢復為用戶默認的分辨率;這樣就不用一一去考慮機型了;
*/
// 定義了分辨率,當前縮放與布局就不需要設置和調(diào)整了;
let userAgent = navigator.userAgent
//判斷是否Chrome瀏覽器
if (userAgent.indexOf('Chrome') > -1) {
console.log('Chrome')
/*
這里使用了setTimeout,讀者一定要注意給打印設置時間;
當前筆者設置了50毫秒的延時時間; 將打印放入了延時隊列,不然printJS立即執(zhí)行打印;
而頁面分辨率還未適配成功,導致打印樣式適配失敗;
這樣做給當前的頁面適配分辨率渲染預留了足夠的時間;
*/
setTimeout(() => {
printJS({
printable: 'printTable', // 標簽元素id,表體;
// maxWidth: 1150, // 最大寬度
font_size: '26pt', // 設置打印時字體大小
type: 'html',
header: this.topHtml, // 打印頂部模板
documentTitle: '',
style: this.printStyle // 打印樣式
})
// 打印完之后 恢復默認分辨率
// 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)
}
},
}如下圖,改變本機分辨率之后的打印顯示;

總結(jié)
到此這篇關于前端printjs使用的文章就介紹到這了,更多相關printjs使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JS 在指定數(shù)組中隨機取出N個不重復的數(shù)據(jù)
這篇文章主要介紹了JS 在指定數(shù)組中隨機取出N個不重復數(shù)據(jù)的方法,需要的朋友可以參考下2014-06-06
小程序云開發(fā)教程如何使用云函數(shù)實現(xiàn)點贊功能
這篇文章主要為大家詳細介紹了小程序云開發(fā)教程如何使用云函數(shù)實現(xiàn)點贊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
firefox事件處理之自動查找event的函數(shù)(用于onclick=foo())
在ie中,事件對象是作為一個全局變量來保存和維護的。 所有的瀏覽器事件,不管是用戶觸發(fā)的,還是其他事件, 都會更新window.event 對象。2010-08-08

