基于react-PC端打印分頁技術(shù)解決方案

基于react-PC端打印分頁技術(shù)解決方案

前言

最近的項(xiàng)目在實(shí)現(xiàn)PC端打印時遇到了個大坑:打印分頁,區(qū)區(qū)一個分頁要考慮的地方竟然還不少,在這里分享一下我關(guān)于分頁的處理思想。
注:本文只專注于打印的分頁部分,不會敘述其他關(guān)于打印的實(shí)現(xiàn)等問題。

展示圖與打印預(yù)覽圖

無分頁效果:


1.png
2.png

有分頁效果圖:


3.5.png
3.6.png
3.7.png
3.8.png

效果圖講解

圖片分兩種,一是前端表格展示圖,二是打印的預(yù)覽圖
表格中間的空隙和第幾頁的紅色標(biāo)記處就是分頁位置。
打印分頁指的是打印時一張紙打印一部分,分頁后中斷這張紙的打印,在下一張紙繼續(xù)打印。

問題需求

  • 打印單據(jù)
  • 分為頭部
  • 內(nèi)容表格(第一頁7行,之后每9行換頁并攜帶頁碼,幾行根據(jù)內(nèi)容大小來定)
  • 尾部
  • 頭和尾部正常寫,表格內(nèi)容和頁面需要計(jì)算高度

總體思路

給行元素添加樣式page-break-after:always;即可從下一行開始換頁
給滿足出現(xiàn)分頁條件的元素添加此樣式
根據(jù)紙張大小和內(nèi)容大小來選擇第一頁和之后每隔多少行換頁

注意:給<table>標(biāo)簽的<tr>標(biāo)簽添加此樣式會出現(xiàn)無效等問題,表格建議手寫,我就是一開始用<table>標(biāo)簽實(shí)現(xiàn)的表格,結(jié)果換頁樣式無效,只好刪掉用其他普通標(biāo)簽如<div>重寫。

分頁時需要考慮的三個關(guān)鍵問題

  • 分頁出現(xiàn)條件
  • 頁碼出現(xiàn)條件
  • 頁碼內(nèi)容。
    下面以解釋+代碼的兩行形式來說明,小數(shù)字代表有幾種情況,只要將每種情況都 || 或起來即可,在需要添加分頁樣式的標(biāo)簽處使用三元符,條件?分頁樣式:null。
    我這里根據(jù)需求和實(shí)際內(nèi)容大小,打印頁第一頁最多七行表格內(nèi)容,之后每頁最多9行表格內(nèi)容。
    item.dtoPrintListList 代表表格內(nèi)容數(shù)組
    valIndex 代表第幾行表格(索引)

一、分頁出現(xiàn)條件

1.七行以上,十六行及以下, 索引+1 = 7

(item.dtoPrintListList.length > 7 && 
item.dtoPrintListList.length <= 16 && 
valIndex +1 = 7 )

2.十六行以上,非最后一行 。 索引+1!==數(shù)組長度 &&(索引 + 1 - 7) % 9 === 0

(item.dtoPrintListList.length > 16 &&
 item.dtoPrintListList.length !== valIndex + 1  && 
(valIndex -6) % 9 === 0 )

表格內(nèi)容在七行及以下時不需要分頁;
七行以上根據(jù)情況:第一頁索引為6時分頁;最后一頁肯定不用再分頁,非最后一頁、非第一頁之間按滿9行就分頁;

二、頁碼出現(xiàn)條件

1.最后一行(索引+1 = 數(shù)組長度)

(valIndex + 1) === item.dtoPrintListList.length) 

2.七行以上,十六行及以下, 索引+1===7

(item.dtoPrintListList.length > 7 && 
item.dtoPrintListList.length <= 16 && 
valIndex +1 = 7 )

3.十六行以上,(索引 + 1 - 7) % 10 === 0

(item.dtoPrintListList.length > 16 &&
(valIndex -6) % 9 === 0 ) 

頁碼出現(xiàn)分三種情況,打印一頁、打印兩頁、打印兩頁以上。只要保證頁碼在每頁只出現(xiàn)一次且出現(xiàn)在此頁表格內(nèi)容最后一行之后即可。

三、頁碼內(nèi)容

頁碼內(nèi)容不進(jìn)入分頁和頁碼的條件判斷樣式中,僅僅用于展示字段
1.七行及以下,展示第1頁
2.七行以上,展示第X頁,X為 (索引 -6)/9 向上取整再加1

{valIndex > 6 ? `第${Math.ceil((valIndex - 6 ) / 9) + 1}頁` : '第1頁'}

因?yàn)槭枪镜捻?xiàng)目,所以就不展示原代碼了。這里只是分享了一下我做打印分頁處理時的思路,僅供參考。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容