使用 wkhtmltopdf 將網(wǎng)頁生成 帶有 封面 呻纹、 目錄堆生、水印的pdf

上一個迭代任務(wù)是將一個html網(wǎng)頁轉(zhuǎn)換成pdf。現(xiàn)有系統(tǒng)轉(zhuǎn)pdf的插件是?TCPDF雷酪,但是這個插件太老舊了淑仆,支持的css樣式和html標簽太少。在嘗試用TCPDF寫了兩天之后果斷放棄了哥力。

然后換成了wkhtmltopdf蔗怠,不得不說?wkhtmltopdf 最后完美得把網(wǎng)頁轉(zhuǎn)成了pdf。接下來我會寫關(guān)于這次生成pdf 用到的知識點吩跋。

wkhtmltopdf 是一個使用 Qt WebKit 引擎做渲染的寞射,能夠把html 文檔轉(zhuǎn)換成 pdf 文檔 或 圖片(image) 的命令行工具。(強調(diào)一下:是“命令行工具”

參考以下文章:

HTML 轉(zhuǎn) PDF 之 wkhtmltopdf 工具簡介: http://www.reibang.com/p/559c594678b6

HTML 轉(zhuǎn) PDF 之 wkhtmltopdf 工具精講 : http://www.reibang.com/p/4d65857ffe5e

1锌钮、封面:

封面是可以自定義的怠惶,我另外寫了一個html頁面當作這個pdf的封面,然后用命令加進去轧粟。

比如:cover.html 是我寫的封面,效果如下圖:

??????

然后生成pdf封面的命令是這個:wkhtmltopdf cover http://api-dev.inboyu.com/pdf-helper/cover?accessToken=d7018f0675f93468a709bce767104312

其中:http://api-dev.inboyu.com/pdf-helper/cover?accessToken=d7018f0675f93468a709bce767104312 是這個cover.html訪問路徑脓魏。accessToken 是返回頁面上標題和申請人所需要的參數(shù)兰吟。

2、頁眉茂翔、頁腳

頁眉混蔼、頁腳也可以 像封面一樣?添加一個html作為的。不過我沒有試過珊燎,我直接用了wkhtmltopdf 提供的命令惭嚣。

wkhtmltopdf --header-left "XXX有限公司" --header-right "[date] [time] 機密文件請勿外傳" --header-line --header-spacing 3 --footer-spacing 3 --footer-center "- 第 [page] 頁-"

3遵湖、目錄

這次迭代的重頭戲就是這個目錄了,也是因為目錄TCPDF不知道怎么實現(xiàn)(或者根本實現(xiàn)不了)才換成了wkhtmltopdf的晚吞。

我們最后生成的目錄是下圖這樣子的:

???

看起來是不是比pdf帶的側(cè)邊欄書簽帥延旧?哈哈

那這個目錄又是怎么實現(xiàn)呢?

這里需要注意的是:太新的wkhtmltopd版本不支持槽地,我用的是?wkhtmltopdf 0.12.3迁沫。

然后目錄是根據(jù)網(wǎng)頁中的H1、H2...標簽來確定的捌蚊。所以網(wǎng)頁中要準備好集畅。

接下來就是一行命令的事情:

wkhtmltopdf toc

所以綜上所述,我將網(wǎng)頁生成一個 擁有 自定義封面缅糟、目錄挺智、頁眉、頁腳的pdf的所有命令如下:

wkhtmltopdf --header-left "XXX科技有限公司" --header-right "[date] [time] 機密文件請勿外傳" --header-line --header-spacing 3 --footer-spacing 3 --footer-center "- 第 [page] 頁-" cover http://api-dev.inboyu.com/pdf-helper/cover?accessToken=d7018f0675f93468a709bce767104312 toc --toc-header-text "目錄" https://api-test.inboyu.com/pdf-helper/get-project-expand-html?accessToken=d7018f0675f93468a709bce767104312 D:\\1.pdf

備注:

1窗宦、--toc-header-text "目錄" 將目錄變成中文赦颇,不然是contents。

2迫摔、http://api-test.inboyu.com/pdf-helper/get-project-expand-html?accessToken=d7018f0675f93468a709bce767104312 是后端獲取要轉(zhuǎn)pdf的一個接口地址沐扳。它拿到的是要轉(zhuǎn)pdf的網(wǎng)頁的所有html。

3句占、D:\\1.pdf 是存放pdf的地址沪摄,因為在本地調(diào)試,所以我存在了D盤目錄下

就這樣簡單纱烘,轉(zhuǎn)換出來的pdf 和 網(wǎng)頁幾乎一摸一樣杨拐。

工具運行命令行如下:

工具運行命令


另外:

1、頁面的布局主要是table布局在pdf中可能會切斷的問題擂啥,解決方法:

tr{page-break-inside: avoid;}

2哄陶、利用?page-break-before: left; 讓以下三個<div></div>將會在生成的pdf中都新開一頁。

<div class="page1" style="page-break-before: left;"></div>

<div class="page2" style="page-break-before: left;"></div>

<div class="page3" style="page-break-before: left;"></div>

3哺壶、我在我的pdf中還加上了水印屋吨,貌似wkhtmltopdf不提供水印方法(還是我沒有找到,如果有人使用了wkhtmltopdf提供的方法山宾,希望能告訴我一下至扰,謝謝了!)

我的做法是切一張水印的圖片资锰,比如下面這個:

???

然后加在這個網(wǎng)頁的最外層的父元素上作為背景敢课,然后repeat這個背景,比如:

<div style="background-image: url('https://vky-test-oss.inboyu.com/upload/39eaa976-fec0-a6f1-f10b-d20fa3da7ae1.png');background-size: 300px;">

? ? //網(wǎng)頁內(nèi)容

? ? //網(wǎng)頁內(nèi)容

? ? //網(wǎng)頁內(nèi)容

</div>

最后實現(xiàn)了水印的效果,需要提醒一下的是直秆,做水印的時候有可能我們網(wǎng)頁的效果和pdf的效果有差距濒募,我調(diào)試的時候是遇到了,明明網(wǎng)頁上的水印好好的圾结,但是生成了pdf之后 水印的間距會有變差瑰剃。這個時候,可以把你的網(wǎng)頁窗口調(diào)整大小疫稿,使得你的網(wǎng)頁趨緊生成的pdf培他,再調(diào)整水印,這樣最后生成的pdf才是準確的遗座,包括前面的提到的封面也可以這么調(diào)試(如果有偏差)舀凛。

我的pdf水印效果如下:

???


4、如果有圖表途蒋,看到別人說加上animation: false; 禁止動畫就可以顯示出來了猛遍,不然生成的pdf里的圖表會是空白。

或者是(我用的方法):

1号坡、先用 <div class="js-kline" style="width:700px;height:450px;" v-show="isShow"></div> 結(jié)合echarts生成一個圖表懊烤。

2、然后調(diào)用echarts的getDataURL方法生成一個圖片地址放到<img src="" id="js-img">

let echartKLine = echarts.init($('.js-kline'));

? ? echartKLine.setOption(option);

? ? window.onresize = echartKLine.resize;

? ? $("#js-img").attr("src",echartKLine.getDataURL())

最后隱藏 js-kline宽堆,顯示 js-img腌紧。

相當于把圖表變成了和這個圖表長得一摸一樣的圖片。


到這里畜隶,基本所有的問題都涉及到了壁肋。生成的pdf幾乎和網(wǎng)頁一摸一樣。

這是我在簡書寫的第一篇文章籽慢,不知道怎么插入代碼浸遗,尷尬。箱亿。跛锌。見諒!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末届惋,一起剝皮案震驚了整個濱河市髓帽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脑豹,老刑警劉巖郑藏,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晨缴,居然都是意外死亡,警方通過查閱死者的電腦和手機峡捡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門击碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筑悴,“玉大人,你說我怎么就攤上這事稍途「罅撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵械拍,是天一觀的道長突勇。 經(jīng)常有香客問我,道長坷虑,這世上最難降的妖魔是什么甲馋? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮迄损,結(jié)果婚禮上定躏,老公的妹妹穿的比我還像新娘。我一直安慰自己芹敌,他們只是感情好痊远,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氏捞,像睡著了一般碧聪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上液茎,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天逞姿,我揣著相機與錄音,去河邊找鬼豁护。 笑死哼凯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的楚里。 我是一名探鬼主播断部,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼班缎!你這毒婦竟也來了蝴光?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤达址,失蹤者是張志新(化名)和其女友劉穎蔑祟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沉唠,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡疆虚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片径簿。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡罢屈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篇亭,到底是詐尸還是另有隱情缠捌,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布译蒂,位于F島的核電站曼月,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柔昼。R本人自食惡果不足惜哑芹,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岳锁。 院中可真熱鬧绩衷,春花似錦、人聲如沸激率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乒躺。三九已至招盲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘉冒,已是汗流浹背曹货。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讳推,地道東北人顶籽。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像银觅,于是被迫代替她去往敵國和親礼饱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容