wkhtmltopdf 遇到的坑以及填坑指南

? 最近公司有一個(gè)中的需求,是將html表單轉(zhuǎn)換成pdf 。

? 無(wú)非方式就只有兩種,前端的方式咱就不說(shuō)了,您能看到這里,必然是采用了市場(chǎng)占有率最高的wkhtmltopdf。

? 優(yōu)缺點(diǎn)都很明顯,廢話不多說(shuō),直接說(shuō)我踩過(guò)的坑和填過(guò)的坑。

? No1.? 有登陸權(quán)限驗(yàn)證的頁(yè)面需要打印為pdf 。如果你要打印的頁(yè)面是基于權(quán)限認(rèn)證的,那你打印出來(lái),必然是跳轉(zhuǎn)到認(rèn)證頁(yè)面的pdf。

? ? ? ? ? ?看到這里,不要懵逼。

? ? ? ? ? wkhtmltopdf 支持賬號(hào)密碼和驗(yàn)證碼登陸,同時(shí)也支持采用cookie 的方式進(jìn)行登陸。大部分時(shí)候采用cookies 登陸即可。

? ? ? ? ? 具體的實(shí)現(xiàn)方式如下:

ProcessStartInfo psi =?new?ProcessStartInfo();

psi.FileName =?"wkhtmltopdf.exe";

string?cookieArgs =?"";

var?cookies = HttpContext.Current.Request.Cookies;


if?(cookies !=?null)

{

????var?sb =?new?System.Text.StringBuilder();

????// you probably only need the ".ASPXFORMSAUTH"

????// and "ASP.NET_SessionId" cookies

????// but I pass everything just in case

????foreach?(string?key?in?cookies.AllKeys)

????{

????????string?value = cookies[key].Value;

????????sb.AppendFormat("--cookie {0} {1} ", key, value);???????????????????

????}

????cookieArgs = sb.ToString();

}

psi.Arguments = urlToPrint +?" -q "?+ cookieArgs +?" -";

Process.Start(psi);

?No2.打印的內(nèi)容不全。?

這時(shí)候要分析具體原因,在wkhtmltopdf 里有一個(gè)參數(shù)是--window-status ,這個(gè)參數(shù)可以支持ajax異步請(qǐng)求 的。

做法是: 在調(diào)用wkhtmltopdf 時(shí),傳入?yún)?shù) ,比如 傳入 “? ?--window-status? completed”? ?,然后在ajax 完成回調(diào)時(shí) ,也將document 的window.status = "completed",這樣的話,就會(huì)完全支持異步調(diào)用。有兩點(diǎn)需要注意:1.每個(gè)參數(shù)之間必須有空格,不然一定會(huì)出現(xiàn)你想到的問(wèn)題。2.window.status 的值必須與傳入的參數(shù)值一樣,否則的話,就會(huì)一直處于等待狀態(tài)。

No3. 空白頁(yè)面,網(wǎng)頁(yè)顯示完好無(wú)損,但打印出來(lái)的卻是空白頁(yè)面。? ? ??

? ? ?這是最大的一個(gè)坑,我研究了一天才踩平了。到現(xiàn)在還有一些疑問(wèn)的地方,等到時(shí)候我在去重新踩 。說(shuō)一下坑在哪里哈.

? ? ? wkhtmltopdf 的工具是基于qt webkit 的。所以基本上目前的流行玩法都是支持的。但特么的也有例外,由于官網(wǎng)已經(jīng)很久沒(méi)有更新,我去github上看到的更新也是很久之前的。

? ? ?如果是普通的mvc 和html 頁(yè)面是完全沒(méi)有問(wèn)題的。但單頁(yè)面應(yīng)用程序的坑就大了。

? ? 我當(dāng)時(shí)用的版本是angular js ,在頁(yè)面顯示完美,但在pdf 打印出來(lái)確實(shí)空白的。

? ? ?起初我認(rèn)為問(wèn)題出現(xiàn)在wkhtmltopdf ,它并不支持單頁(yè)面應(yīng)用程序。但我用vue 測(cè)試的沒(méi)有問(wèn)題。于是我重新測(cè)試angular js ,我在github 看了每一個(gè)提問(wèn)者的問(wèn)題。發(fā)現(xiàn)一個(gè)提問(wèn)者講到,他用的angular js? 1.4的版本出現(xiàn)了問(wèn)題,回撤到1.3.5 則正常。于是我發(fā)現(xiàn)新大陸一樣,將angular js?的版本也回車到了1.3.5 ,發(fā)現(xiàn)打印出來(lái)的頁(yè)面不在是空白頁(yè)面,是有內(nèi)容的頁(yè)面。由于我頭一次接觸angluar js ,我問(wèn)同事才得知,angluar js 1.4版本跨度比較大,改變了好多的內(nèi)容,包括請(qǐng)求方式都發(fā)生了很大的變化。這也就解釋了,為啥使用angular js 打印的是空白頁(yè),因?yàn)閍ngular js 1.4以上的版本,你用wkhtmltopdf 根本就調(diào)用不到后臺(tái)的內(nèi)容,壓根就不會(huì)發(fā)起請(qǐng)求。

? ? ? 別急,到這里,坑還沒(méi)結(jié)束,雖然能請(qǐng)求后端了,但是我發(fā)現(xiàn),打印出來(lái)的內(nèi)容卻缺少了很多東西,這時(shí)候就尷尬了,angular js 1.4 以上的 渲染的內(nèi)容沒(méi)有問(wèn)題,但不能向后臺(tái)發(fā)起請(qǐng)求,angular js 1.3.5能發(fā)起請(qǐng)求,但問(wèn)題是打印的時(shí)候渲染不出內(nèi)容。 經(jīng)過(guò)我和同事的一步步調(diào)試,發(fā)現(xiàn)問(wèn)題竟然在css ,一個(gè)叫overflow 的標(biāo)簽直接影響內(nèi)容。 具體詳情請(qǐng)參考前輩的:http://www.itdecent.cn/p/57c897cfaa27

? ? 周六折騰了一天,總算是搞定了。希望對(duì)大家能有所幫助,如果有什么問(wèn)題,大家及時(shí)留言。我會(huì)盡快的幫助大家解決。

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

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,827評(píng)論 1 45
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化,入門級(jí)到專家級(jí),廣度和深度都會(huì)有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,687評(píng)論 0 7
  • 一:什么是閉包?閉包的用處? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 10,053評(píng)論 1 52
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā),例如說(shuō)新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 4,046評(píng)論 2 7
  • 今天聽行動(dòng)君的節(jié)日,一句話打動(dòng)我,讓我懷念,讓我深思,讓我回憶…… 行動(dòng)君說(shuō):除了學(xué)生時(shí)代,再也沒(méi)有人陪你一起做同...
    愛暖心扉一悠悠閱讀 299評(píng)論 0 1

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