下面由laravel教程栏目给大家介绍如何使用laravel-snappy导出pdf,希望对需要的朋友有所帮助!
前言
论坛里有很多关于如何使用 laravel-snappy 的文章,但是很多都停留在安装、基本示例,对于实际的应用既没有说明用法,也没有解答一些问题和疑惑,因此在此整理一下,权当做个记录吧。
安装
以 ubuntu 为例
1. 执行安装 wkhtmltopdf:
composer require h4cc/wkhtmltopdf-amd64 0.12.xcomposer require h4cc/wkhtmltoimage-amd64 0.12.x
顾名思义,分别安装的是 wkhtmltopdf 和 wkhtmltoimage。
2. 复制 wkhtmltopdf 到 ubuntu 可执行命令的目录中
sudo cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/sudo cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin///并使其可执行: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 数组中
barryvdh\snappy\serviceprovider::class
5. 将 facades 添加到 config/app.php 中的 aliases 数组中
'pdf' => barryvdh\snappy\facades\snappypdf::class,'snappyimage' => barryvdh\snappy\facades\snappyimage::class,
6. 执行生成配置文件
php artisan vendor:publish --provider="barryvdh\snappy\serviceprovider"
可以看到默认的配置文件为 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' => [], ],];
注意,这里有个坑,默认 binary 配置为 /usr/local/bin/wkhtmltopdf 和 /usr/local/bin/wkhtmltoimage,在第一次使用的时候,会报错 /usr/local/bin/wkhtmltopdf不存在,这是因为在 linux 系统下,wkhtmltopdf 和 wkhtmltoimage 的真实路径和名称为:/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 = '<html><head><meta charset="utf-8"></head><h1>订单id</h1><h2>12346546</h2></html>';$pdf = \pdf::loadhtml($html);return $pdf->inline();
很多博客里没有提到,使用方法 1 中,会报这样的错:
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'.
执行:
sudo apt-get updatesudo apt install libssl1.0-dev
修复完成,导出 welcome 页面。
如果使用 save () 方法保存,默认保存到 /public 文件夹下,并且如果文件名相同的情况下,第二次保存会提示文件已经存在。
以上就是一文讲解laravel-snappy如何导出pdf的详细内容。