JS在調用 window.print 打印時候,如何修改原來的頁眉頁腳,以及根據業務需求定制化頁腳:
在網上能查到的資料分為兩種:
- 通過 ActiveXObject 構造函數來修改。
- 通過 css 控制,即 @page 選擇器。
經過排查:
第一種僅在IE下可用,並且需要開啟一個xxx設置,在較高的 IE 版本下測試過,直接報錯,同時考慮大環境下慢慢拋棄IE老版本,因此這種方法等於沒有。
第二種方法很多博文記載的很詳細,但是內容幾乎一樣,基本都說的是通過以下這些選擇器可以直接修改(舉例子,並不全)。
@page :first {
color: green;
@top-left {
content: "foo";
color: blue;
}
@top-right {
content: "bar";
}
}
@page { color: red;
@top-center {
content: "Page " counter(page);
}
}
經多次排查及測試,基本都是來自 W3C 的 copy,附上鏈接 https://www.w3.org/TR/css-page-3/,常見瀏覽器基本都不支持這些,僅有其中少數幾個選擇器可以使用,可以改改邊距(可通過減少頁邊距隱藏頁眉頁腳),設置紙張方向等,無法達到我的需求(修改頁眉,頁面內容)。
因此只要查到講的是這一內容的博文基本可以不用看了,浪費時間。
那么如何實現這一業務需求呢?這里我通過模擬css定位的方式模擬一個頁眉和頁碼,並在打印選項里關閉頁眉和頁腳
思路:
將每一頁增加一個父級盒子,並給上 定位,如:
/* 父級盒子 */
.warpper {
position: relative
}
/*頁眉, 通過負數向上移 */
.head {
position: absolute;
top: -10px;
}
/*頁腳*/
.foot {
position: absolute;
bottom: 10px;/* 這個值自己調整 */
}
最終實現的效果
關於打印的一些其它注意事項,主要跟表格有關,這里簡單說下:
-
表格的拆分問題,當表格太長一頁放不下,打印時系統會將其切割,因此這里有兩種方式: 通過 thead 標簽讓表格在換頁后自動帶一個表頭過去,即同一個表格換了 n 頁就有 n 個表頭。 如果是靜態的寫死的表格,手動將表格一分為多;若是根據 Array 等數據結構循環生成的表格,則先將數據結構拆分成多分,再依次生成。
-
表格列寬默認是會在你設置寬度基礎上自行適應調整的,有一個表格屬性 table-layout: fixed 可能會用的上。
-
換頁問題,使用 page-break-after: always;注:在某些情況下無法分頁,使用時盡量用統一的 class 和標簽,並將兩張要分頁的內容分別用一個盒子包裹,規范好!
-
對於打印時需要生成二維碼,最好先將二維碼轉化成圖片,一般為 base64 格式,然后在打印前確定圖片 onload 后再打印,注意 jquery.qrcode 是有延遲的。