最全前端Web報表打印方法彙總
(一)背景介紹
大家在日常辦公過程中經常需要進行文檔打印,比如:打印Excel表格、PPT文檔、照片。此外,在大家使用的各種應用系統中也都提供了打印功能,而不是讓大家必須導出一個Excel或者PDF文件再進行打印,比如:CRM中的合同打印、ERP中的BOM物料清單打印、HIS醫療信息系統中的電子病歷打印、WMS中的出庫入庫單、財務系統中的發票打印等等。這些集成到應用系統中的打印功能的確讓用户方便了不少,但是對於軟件開發者來説,在為這麼多場景的不同打印需要尋求技術方案時就比較頭疼了。
本文將彙總大家遇到的各種報表打印需求和實現方案,希望能夠對有相關需要的小夥伴們起到一定的幫助作用,讓程序猿同學們少些加班、多些生活。
(二)認識打印機類型
在開始介紹打印實現方案之前,我們需要了解一下現在市面是場景的打印類型,以及他們的主要用途。
- 激光打印機:激光打印機適用於公司、學校、工廠等場景。它使用激光掃描成像技術,通過激光束將數據信號轉化為圖像,然後將墨粉加熱固化到紙張上。激光打印機的打印速度較快,打印質量較高,適合打印大量文檔和表格。
- 噴墨打印機:噴墨打印機適合學生和家庭使用。它使用墨盒來實現打印,通過噴頭將墨水噴印到紙上,形成圖案或字符。噴墨打印機的打印成本較低,適合打印彩色照片和文檔。
- 熱敏打印機:常用於打印超市小票、電影票、車票等。它是一種工業打印機,使用經過化學處理的熱敏介質,當應用於熱敏打印頭時會變暗。與傳統的打印機不同,熱敏打印機沒有色帶、墨水或碳粉,可以做成便攜式打印機。
- 針式打印機:常用於打印發票、快遞面單、多聯複印紙、倉庫出入庫單據打印等。它是一種特殊的打印機,它使用打印頭中的多根金屬撞針,通過撞擊色帶,將圖像或字符印在紙上。
在對以上四種打印機有了初步瞭解之後,我們接下來就直接進入各場景下打印的實現方案。
(三)常見打印方式場景
打印需求和很多因素相關,比如:所在行業的不同(工業、醫院、學校、零售等),打印外觀需求的不同(全部打印、部分打印),打印時機的不同(第一次打印、第二次打印),打印數量的不同(打一份、打N份),打印紙張的不同(A4紙、多聯複印、不固定高度的小票製作/熱敏紙),打印顏色的不同(黑白和彩色)等,這些因素綜合起來決定了打印實現方式的多樣化。那我們就由淺入深,來看看不同打印類型的實現方法:
1.直接打印
這類打印沒有什麼特別的,就是所見即所得的方式打印全部內容,比如:客户名單打印、商品清單打印等。
2.報表套打
這類打印是將部分類容打印到特定紙張上,典型的有快遞單打印、發票打印、出庫入庫單據打印等,因為這些紙張上面已經有內容,我們只需要把部分數據進行打印,而不用打印紙張上已經有的背景內容。比如:財務發票紙張貝萊就有很多制式內容,我們只需要把公司名稱、納税號、商品明細這些和當此交易相關的內容進行打印。
3.小票打印
這兒主要説的是超市小票打印、餐飲小票打印,而不是電影票、車票打印,兩者根本區別在於紙張大小是否固定。超市小票打印會在一張紙上連續不間斷的打印所有購買的商品信息,所以,實際打印內容的高度(或者長短)不是設定好的A4或者其他固定紙張。而且這類打印所需要的紙張高度不容易事先計算好,這主要是是大於內容的動態性決定的,比如:這次購買了50種商品,我們可以直接打印這50行數據,但是,我們也可能按照商品類型歸類打印,這樣打印出來的就是50+N行,這兒的N就是商品的類型數量,更復雜的是如果要添加分類小計,那麼實際打印的行數就是50+2N。
4.重複表格列標題打印
這類打印需求主要出現在明細表格和透視表格打印的情況,為了讓打印到紙張之後每頁都有標題、表頭、便於閲讀。我們設想有一份1000行、50列的表格數據要打印到紙張上,如果我們只在第一頁顯示錶格的標題行,那麼我們看第二頁之後的數據時,都還的翻到第一頁看每列數據的真實含義,是不是特別不方便。為了解決這個問題,就希望在數據分頁展示、分頁打印的時候能,每頁都能顯示錶格標題行,這樣很容易知道每列數據對應的含義。
5.重複表格列標題和行標題打印
那在實際應用過程中,表格數據展示時除了列頭還有行頭,我們看下面這份數據,每行數據的第一列也起到標題的作用,我們在看每個單元格數據的真實含義時,需要同時看所在行和所在列才能確定其真實含義,比如下圖中紅框單元格代表的行業時xxxx。這類表格數據在不分頁展示的通過固定表頭還是比較容易理解的,但是當我們進行分頁展示和打印時,我們就希望每頁都顯示行頭和列頭,這樣看數據才方便。
6.填充空白行打印
以下兩張圖主要區別在於空白區域是否打印空行。我們經常遇到當打印一份報表內容不夠撐滿一頁,這樣就會空很大一片,一方面不美觀,另一方面在一些特殊情況下這也不太合規,所以就出現了填充空白行打印的需要。
7.空白區域畫斜線打印
這類打印需求更多出現在處方單上面,一張B5紙上面只打印了兩種藥品,下方還空了很大一部分區域,以往了就是醫生打印出來之後自己畫一條斜線,然而科技的發展不就是為了減少沒有必要的人力投入嘛,如果能夠給空白區域自動打印一條斜線,不是很爽嗎。由此,在HIS系統中就需要這種空白區域畫斜線的打印需要。小夥伴們還遇到其他需要動態畫線的應用場景嗎,歡迎分享討論啊!
8.批量打印
首先要説明一下這兒介紹的批量打印不是把同樣的內容打印 N 份的概念,而是用同樣的格式打印 N 份不同的數據。比如:一個單位98名員工的體檢預約單、一個班53位學生的期末綜合素質報告單。這類報表設計和打印的核心在於,每一個人的信息打印之後需要強制換頁,然從下一頁開始打印另一個人的信息。
9.電子簽章打印
可能有小夥伴會問,電子簽章不就是把簽證圖片打印到報表上嗎,有什麼特別的。如果你要打印的報表頁數是固定的,你可以在最後一頁添加這個簽章進行打印,而實際應用中需要蓋章的地方往往是不固定的,比如:一份合同可能有2頁,也可能有3頁,具體有幾頁是有合同內容決定,我們必須找到最後一頁的右小角來蓋章。這種動態性就增加了電子簽章打印的複雜性。
10.騎縫章打印
騎縫章打印和電子簽章打印有相似的地方,其特點都是一份報表的頁數不固定,導致我們無法用一個固定的方案進行打印,必須根據報表頁數拆分每頁應該顯示的內容。比如:一份5頁的合同,簽章圖片就需要拆分為5份,而一份8頁的合同,簽章圖片就需要拆分為8份。
11.靜默打印
好了,我們把困擾廣大軟件開發工程師(程序猿)的問題放到最後討論,靜默打印是指在打印過程中,無需用户手動操作或預覽的一種打印方式。在靜默打印中,打印機會自動根據預設的打印設置進行打印,而無需用户干預。其核心作用有兩方面:
- 簡化用户操作步驟,我們以倉庫管理員打印出庫單為例,每打印一次出庫單,需要點擊1次鼠標和點擊5次鼠標的區別看上去不大,但是如果一天要打印500張出庫單,你就知道點擊鼠標也是一件讓人痛苦的事情,辦公效率可能因此下降10%,會帶來物流運輸、客户簽收、財務匯款等所有環節的工作效率降低10%,這是一件多麼可怕的事情。
- 安全和控制的需要,我們去政務大廳辦理業務的時候,通常需要先打印一些材料,這時候我們只需要點擊打印按鈕就可以,而不需要讓我們選擇打印機、打印紙質、黑白/彩色,這些工作不僅簡化了操作難度,更重要的是安全,你絕對不會以為打印機名稱選擇錯誤,把你的材料從一樓打印到二樓打印機上。
總結
在桌面應用時代這並不困難,然後在Web應用時代就比較麻煩,主要原因是瀏覽器安全控制,需要讓用户主動操作之後才能讀取瀏覽器所在客户端環境的硬件資源,簡單説就是不能在用户不知曉的情況下給打印機發送打印任務。所以,大家就需要通過一些插件來實現打印,用A工具開發報表,然後藉助B工具進行靜默打印。但是讓程序員頭疼的是,因為客户安裝瀏覽器的不同,打印插件頻繁罷工、不好好工作。
擴展鏈接
AI 對話式分析,讓數據洞察像聊天一樣簡單