跨平台導PDF,結合wkhtmltopdf很順手
- 2021 年 1 月 22 日
- 筆記
- .netcore, 跟我一起學.NetCore
前言
好東西要分享,之前一直在使用wkhtmltopdf進行pdf文件的生成,常用的方式就是先安裝wkhtmltopdf,然後在程式中用命令的方式將對應的html生成pdf文件,簡單而且方便;但重複的編碼使得想在wkhtmltopdf基礎上進行封裝,偶然間發現有小夥伴已經封裝的還不錯啦,常用的功能都已經實現,源碼地址://github.com/fpanaccia/Wkhtmltopdf.NetCore。
作者將其打包成Nuget包(Wkhtmltopdf.NetCore),直接引入使用即可;
正文
既然用到了.NetCore,肯定就要考慮到跨平台兼容性,對於wkhtmltopdf之前一直是在Windows上使用,還沒有在其他平台嘗試;這個包封裝的行不行,拉出來遛遛就知道啦,接下來就試試:
1. 建個API項目,引入包和兼容對應平台的wkhtmltopdf執行文件;
註: 默認依賴的wkhtmltopdf執行文件需要存放在Rotativa目錄下,可以自定義名稱,如果自定義,需要再註冊服務時指定對應的文件名;這裡的wkhtmltopdf已經根據不同平台進行編譯打包了,無需安裝,這些文件在源碼那就有;
2.創建PDFTestController控制器,添加如下介面進行測試;
首先把生成pdf的服務注入進來,後續直接使用就可以啦:
接下來就開始寫介面啦,這裡只是測試,程式碼冗餘沒有考慮,在實際項目中小夥伴可以根據自己需求進行封裝;
-
ExportPDFByHtml 介面,用html直接生成pdf文件,但這裡沒有保存,以文件流的形式訪問,通過瀏覽器查看文件,可以自行下載;html模板在實際開發過程中可以單獨用文件存儲;
-
SavePDFByHtml介面,直接保存文件,文件名可以根據需要進行自定義;
-
TestMarginAndPageSize介面,設置Margin和PageSize參數,其他參數也可以設置;
ConvertOptions默認封裝了以下屬性,小夥伴也可以自定義擴展,只要繼承IConvertOptions即可,這裡就不演示的,因為官方有對應的案例,下夥伴下去搞搞,wkhtmltopdf的參數挺多的,都可以進行封裝使用。
-
ExportByRazorView使用Razor視圖的方式進行pdf文件生成,此庫已經支援cshtml文件的讀取
根據指定視圖生成對應的pdf效果,如下:
-
ExportByRazorViewData數據動態綁定,既然支援視圖,那就應該支援Razor語法,一般常用的就是數據綁定了,上面是靜態的,接下來來個動態綁定的。
根據指定視圖生成對應的pdf效果,如下:
如上基本的使用演示就說那麼多,使用還是很簡單,小夥伴後續可以根據自己的需要進行相關擴展;當然還有其他功能,比如設置頁眉/頁腳等,作者提供有對應的案例;這裡不說那麼多,不然又是長文。
3. 小夥伴用的時候可能會遇到的問題
-
在開發調試運行項目時,會報找不到wkhtmltopdf文件,那是因為運行時的確找不到對應的文件,將對應Rotativa下的文件設置為始終複製即可:
-
在Windows下怎麼玩都沒問題啦,開始發布到Linux(我用的centos 7),我擦,莫名其妙的錯。
看見這個錯我懵的,一頓搜索猛如虎,還是沒找到答案;冷靜下來,重新捋捋,原來是自己在犯傻;
兩個問題需要解決,1.上傳到Linux下的wkhtmltopdf沒有給執行許可權;2.可能環境缺少對應的依賴庫;
設置可執行許可權
在Linux環境下,可以通過
ll
命令查看許可權,剛開始是沒有許可權的,只需要執行chmod 777 wkhtmltopdf
命令,執行許可權就有了,如下圖中紅框中的x就是可執行許可權;安裝缺少的依賴庫
可執行許可權開啟之後,別急著去訪問頁面,這樣可能還是錯誤。因為可能缺少依賴庫,那咋知道缺少呢,我是直接執行wkhtmltopdf,執行成功就沒啥,不成功就會報缺少相關依賴,然後直接安裝就行啦;執行
./wkhtmltopdf //www.baidu.com ./test.pdf
試試就知道啦,因為wkhtmltopdf本身是可以單獨運行的,並不依賴我們寫的程式。 -
當執行成功之後,然後開始訪問介面導出功能,如果不出意外,遇到中文就產生亂碼啦,那是因為Linux環境下缺少相關的字體文件,將對應的字體文件拷貝到Linux上即可,字體我找好了,下載地址如下:
鏈接: //pan.baidu.com/s/1jikC0DUkpEzpXL5ysjEQPA 提取碼: tn4j ;
將下載下來的字體解壓,然後拷貝到Linux下的 /usr/share/fonts目錄下即可
最後這樣應該就沒啥問題啦,剩下的就交給小夥伴自己摸索搞實踐吧;
此文源碼地址://github.com/zyq025/DotNetCoreStudyDemo
wkhtmltopdf官網地址://wkhtmltopdf.org/
總結
使用還是很簡單的,常規的需求沒啥問題,如果需要功能訂製化,小夥伴可以參考源碼,自己封裝一個(封裝思路不難的); 如果小夥伴有比較好的導出庫,免費開源的那種,一起分享出來玩玩。
一個被程式搞丑的帥小伙,關注”Code綜藝圈”,識別關注跟我一起學~~~