背景
- wkhtmltopdf這個庫友好地支持將html文件轉(zhuǎn)換為pdf文件爹橱,它基于QT的webkit進行渲染腐泻,因此依賴于操作系統(tǒng)的圖形用戶界面操作滴肿。
- 而服務(wù)器一般是運行級別3(即多用戶狀態(tài)下的字符終端界面)岳悟,因此在服務(wù)器端直接調(diào)用wkhtmltopdf會報如下錯誤:
qt.qpa.screen: QXcbConnection: Could not connet to display
Cloud not connect to any X display
- 原因就在于wkhtmltopdf依賴于X server (linux 操作系統(tǒng)里面圖形接口服務(wù)器的簡稱),而一般服務(wù)器運行在字符終端級別,并沒有啟動圖形用戶界面 贵少,因此產(chǎn)生無法連接到X display服務(wù)的錯誤呵俏。
解決方案
在 xvfb(X virtual framebuffer)中運行wkhtmltopdf, xvfb能夠直接處理圖形化功能滔灶,給應(yīng)用程序提供一個虛擬的X server普碎。
ubuntu 下使用包管理工具直接安裝
sudo apt-get install xvfb
- 在xvfb中運行wkhtmltopdf
xvfb-run wkhtmltopdf $source $destination
- 通過這種方式即可解決wkhtmltopdf產(chǎn)生的"Cloud not connect to any X display"的錯誤。
參考代碼
- 以下提供golang版本的示例代碼
- 該代碼將htmlFile(絕對路徑)這個html文件轉(zhuǎn)換為pdfFile(絕對路徑)pdf文件
func generatePdfFile(htmlFile string, pdfFile string)error{
// xvbf命令
xvfbCommand, err := exec.LookPath("xvfb-run")
if err != nil{
return errors.New("xvfb未安裝")
}
// wkhtmltopdf命令
wkh2fCommand, err := exec.LookPath("wkhtmltopdf")
if err != nil{
return errors.New("wkhtmltopdf未安裝")
}
args := []string{wkh2fCommand, htmlFile, pdfFile}
errBuf := &bytes.Buffer{}
cmd := exec.Command(xvfbCommand, args...)
cmd.Stderr = errBuf
err = cmd.Run()
if err != nil{
errStr := errBuf.String()
if strings.TrimSpace(errStr) == ""{
errStr = err.Error()
}
return errors.New(errStr)
}
return nil
}
- 另录平,關(guān)于操作系統(tǒng)的7個運行級別如下
關(guān)于操作系統(tǒng)的7個運行級別
運行級別0:系統(tǒng)停機狀態(tài)麻车,系統(tǒng)默認運行級別不能設(shè)為0,否則不能正常啟動
運行級別1:單用戶工作狀態(tài)斗这,root權(quán)限动猬,用于系統(tǒng)維護,禁止遠程登陸
運行級別2:多用戶狀態(tài)(沒有NFS)
運行級別3:完全的多用戶狀態(tài)(有NFS)涝影,登陸后進入控制臺命令行模式
運行級別4:系統(tǒng)未使用枣察,保留
運行級別5:X11控制臺,登陸后進入圖形GUI模式
運行級別6:系統(tǒng)正常關(guān)閉并重啟燃逻,默認運行級別不能設(shè)為6序目,否則不能正常啟動