好東西要分享,以前一直在使用wkhtmltopdf進行pdf文件的生成,經常使用的方式就是先安裝wkhtmltopdf,而後在程序中用命令的方式將對應的html生成pdf文件,簡單並且方便;但重複的編碼使得想在wkhtmltopdf基礎上進行封裝,偶然間發現有小夥伴已經封裝的還不錯啦,經常使用的功能都已經實現,源碼地址:https://github.com/fpanaccia/Wkhtmltopdf.NetCore。html
做者將其打包成Nuget包(Wkhtmltopdf.NetCore),直接引入使用便可;git
既然用到了.NetCore,確定就要考慮到跨平臺兼容性,對於wkhtmltopdf以前一直是在Windows上使用,尚未在其餘平臺嘗試;這個包封裝的行不行,拉出來遛遛就知道啦,接下來就試試:github
1. 建個API項目,引入包和兼容對應平臺的wkhtmltopdf執行文件;centos
注: 默認依賴的wkhtmltopdf執行文件須要存放在Rotativa目錄下,能夠自定義名稱,若是自定義,須要再註冊服務時指定對應的文件名;這裏的wkhtmltopdf已經根據不一樣平臺進行編譯打包了,無需安裝,這些文件在源碼那就有;瀏覽器
2.建立PDFTestController控制器,添加以下接口進行測試;測試
首先把生成pdf的服務注入進來,後續直接使用就能夠啦:字體
接下來就開始寫接口啦,這裏只是測試,代碼冗餘沒有考慮,在實際項目中小夥伴能夠根據本身需求進行封裝;編碼
ExportPDFByHtml 接口,用html直接生成pdf文件,但這裏沒有保存,以文件流的形式訪問,經過瀏覽器查看文件,能夠自行下載;html模板在實際開發過程當中能夠單獨用文件存儲;調試
SavePDFByHtml接口,直接保存文件,文件名能夠根據須要進行自定義;code
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 https://www.baidu.com ./test.pdf
試試就知道啦,由於wkhtmltopdf自己是能夠單獨運行的,並不依賴咱們寫的程序。
當執行成功以後,而後開始訪問接口導出功能,若是不出意外,遇到中文就產生亂碼啦,那是由於Linux環境下缺乏相關的字體文件,將對應的字體文件拷貝到Linux上便可,字體我找好了,下載地址以下:
連接: https://pan.baidu.com/s/1jikC0DUkpEzpXL5ysjEQPA 提取碼: tn4j ;
將下載下來的字體解壓,而後拷貝到Linux下的 /usr/share/fonts目錄下便可
最後這樣應該就沒啥問題啦,剩下的就交給小夥伴本身摸索搞實踐吧;
此文源碼地址:https://github.com/zyq025/DotNetCoreStudyDemo
wkhtmltopdf官網地址:https://wkhtmltopdf.org/
使用仍是很簡單的,常規的需求沒啥問題,若是須要功能定製化,小夥伴能夠參考源碼,本身封裝一個(封裝思路不難的); 若是小夥伴有比較好的導出庫,免費開源的那種,一塊兒分享出來玩玩。
一個被程序搞醜的帥小夥,關注"Code綜藝圈",識別關注跟我一塊兒學~~~