下面由laravel教程欄目給大家介紹如何使用laravel-snappy導(dǎo)出pdf,希望對(duì)需要的朋友有所幫助!
前言
論壇里有很多關(guān)于如何使用 Laravel-snappy 的文章,但是很多都停留在安裝、基本示例,對(duì)于實(shí)際的應(yīng)用既沒有說(shuō)明用法,也沒有解答一些問(wèn)題和疑惑,因此在此整理一下,權(quán)當(dāng)做個(gè)記錄吧。
安裝
以 ubuntu 為例
1. 執(zhí)行安裝 wkhtmltopdf:
composer?require?h4cc/wkhtmltopdf-amd64?0.12.x composer?require?h4cc/wkhtmltoimage-amd64?0.12.x
顧名思義,分別安裝的是 wkhtmltopdf 和 wkhtmltoimage。
2. 復(fù)制 wkhtmltopdf 到 ubuntu 可執(zhí)行命令的目錄中
sudo?cp?vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64?/usr/local/bin/ sudo?cp?vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64?/usr/local/bin/ //并使其可執(zhí)行: sudo?chmod?+x?/usr/local/bin/wkhtmltoimage-amd64? sudo?chmod?+x?/usr/local/bin/wkhtmltopdf-amd64
3. 安裝 laravel-snappy
composer?require?barryvdh/laravel-snappy
4. 將 ServiceProvider 添加到 config/app.php 中的 providers 數(shù)組中
BarryvdhSnappyServiceProvider::class
5. 將 Facades 添加到 config/app.php 中的 aliases 數(shù)組中
'PDF'?=>?BarryvdhSnappyFacadesSnappyPdf::class, 'SnappyImage'?=>?BarryvdhSnappyFacadesSnappyImage::class,
6. 執(zhí)行生成配置文件
php?artisan?vendor:publish?--provider="BarryvdhSnappyServiceProvider"
可以看到默認(rèn)的配置文件為 config/snappy.php:
return?[ ????'pdf'?=>?[ ????????'enabled'?=>?true, ????????'binary'??=>?env('WKHTML_PDF_BINARY',?'/usr/local/bin/wkhtmltopdf'), ????????'timeout'?=>?false, ????????'options'?=>?[], ????????'env'?????=>?[], ????], ????'image'?=>?[ ????????'enabled'?=>?true, ????????'binary'??=>?env('WKHTML_IMG_BINARY',?'/usr/local/bin/wkhtmltoimage'), ????????'timeout'?=>?false, ????????'options'?=>?[], ????????'env'?????=>?[], ????], ];
注意,這里有個(gè)坑,默認(rèn) binary 配置為 /usr/local/bin/wkhtmltopdf 和 /usr/local/bin/wkhtmltoimage,在第一次使用的時(shí)候,會(huì)報(bào)錯(cuò) /usr/local/bin/wkhtmltopdf不存在,這是因?yàn)樵?linux 系統(tǒng)下,wkhtmltopdf 和 wkhtmltoimage 的真實(shí)路徑和名稱為:/usr/local/bin/wkhtmltopdf-amd64 和 /usr/local/bin/wkhtmltoimage-amd64。
因此,需要把配置信息修改為:
'pdf'?=>?[ ????????... ????????'binary'??=>?env('WKHTML_PDF_BINARY',?'/usr/local/bin/wkhtmltopdf-amd64'), ????????... ????], ????'image'?=>?[ ????????... ????????'binary'??=>?env('WKHTML_IMG_BINARY',?'/usr/local/bin/wkhtmltoimage-amd64'), ????????... ????],
開始使用
//使用方法1 $pdf?=?PDF::loadView('welcome',?$data); return?$pdf->download('welcome.pdf'); //使用方法2 $html?=?'<meta><h1>訂單id</h1><h2>12346546</h2>'; $pdf?=?PDF::loadHTML($html); return?$pdf->inline();
很多博客里沒有提到,使用方法 1 中,會(huì)報(bào)這樣的錯(cuò):
The?exit?status?code?'1'?says?something?went?wrong:?stderr:?"Loading?pages?(1/6)?[>?]?0%?[======>?]?10%?QSslSocket:?cannot?resolve?CRYPTO_num_locks?QSslSocket:?cannot?resolve?CRYPTO_set_id_callback?QSslSocket:?cannot?resolve?CRYPTO_set_locking_callback?QSslSocket:?cannot?resolve?sk_free?QSslSocket:?cannot?resolve?sk_num?QSslSocket:?cannot?resolve?sk_pop_free?QSslSocket:?cannot?resolve?sk_value?QSslSocket:?cannot?resolve?SSL_library_init?QSslSocket:?cannot?resolve?SSL_load_error_strings?QSslSocket:?cannot?resolve?SSLv3_client_method?QSslSocket:?cannot?resolve?SSLv23_client_method?QSslSocket:?cannot?resolve?SSLv3_server_method?QSslSocket:?cannot?resolve?SSLv23_server_method?QSslSocket:?cannot?resolve?X509_STORE_CTX_get_chain?QSslSocket:?cannot?resolve?OPENSSL_add_all_algorithms_noconf?QSslSocket:?cannot?resolve?OPENSSL_add_all_algorithms_conf?QSslSocket:?cannot?resolve?SSLeay?QSslSocket:?cannot?call?unresolved?function?CRYPTO_num_locks?QSslSocket:?cannot?call?unresolved?function?CRYPTO_set_id_callback?QSslSocket:?cannot?call?unresolved?function?CRYPTO_set_locking_callback?QSslSocket:?cannot?call?unresolved?function?SSL_library_init?QSslSocket:?cannot?call?unresolved?function?SSLv23_client_method?QSslSocket:?cannot?call?unresolved?function?sk_num?[==================>?]?31%?QSslSocket:?cannot?call?unresolved?function?SSLv23_client_method?QSslSocket:?cannot?call?unresolved?function?SSL_library_init?[============================================================]?100%?Counting?pages?(2/6)?[============================================================]?Object?1?of?1?Resolving?links?(4/6)?[============================================================]?Object?1?of?1?Loading?headers?and?footers?(5/6)?Printing?pages?(6/6)?[>?]?Preparing?[============================================================]?Page?1?of?1?Done?Exit?with?code?1?due?to?network?error:?UnknownNetworkError?QSslSocket:?cannot?call?unresolved?function?CRYPTO_num_locks?QSslSocket:?cannot?call?unresolved?function?CRYPTO_set_id_callback?QSslSocket:?cannot?call?unresolved?function?CRYPTO_set_locking_callback?"?stdout:?""?command:?/usr/local/bin/wkhtmltopdf-amd64?--lowquality?'/tmp/knp_snappy612c3edcdfc855.21787864.html'?'/tmp/knp_snappy612c3edcdfce49.80482557.pdf'.
執(zhí)行:
sudo?apt-get?update sudo?apt?install?libssl1.0-dev
修復(fù)完成,導(dǎo)出 welcome 頁(yè)面。
如果使用 save () 方法保存,默認(rèn)保存到 /public 文件夾下,并且如果文件名相同的情況下,第二次保存會(huì)提示文件已經(jīng)存在。