Laravel中如何通过HTML生成PDF

本文翻译自https://laravelcode.com/post/html-to-pdf-in-laravel-using-barryvdh-laravel-snappy,英语好的请移步原文。

今天,laravel code教你如何在laravel中使用barryvdh/laravel-snappy包把HTML转换成PDF。最近在用Laravel的应用中集成了barryvdh/laravel-snappy包,通过HTML生成PDF,但是遇到了一些问题。在Google后,改变一些配置,最终实现。所以写这篇教程帮助疑惑者。

首先分享给你开发时遇到的一些问题。你是否通过这个包HTML生成PDF?按照以下步骤走就可以。

步骤一:引入包依赖

安装barryvdh/laravel-snappy前,必须引入包的依赖。需要运行以下命令引入两个依赖。

注意:如果是32位的linux系统使用以下命令:

$ composer require h4cc/wkhtmltopdf-i386 0.12.x
$ composer require h4cc/wkhtmltoimage-i386 0.12.x

注意:如果是64位的linux系统使用以下命令:

$ composer require h4cc/wkhtmltopdf-amd64 0.12.x
$ composer require h4cc/wkhtmltoimage-amd64 0.12.x

注意:非Linux系统,请到wkhtmlto*官网自行下载后放到指定目录。

步骤二:引入barryvdh/laravel-snappy包

安装完两个依赖后,继续运行以下命令安装HTML生成PDF的包:

composer require barryvdh/laravel-snappy

步骤3:配置文件

安装包成功后,在config/app.php文件中配置service providers和aliaces

'providers' => [
	....
	Barryvdh\Snappy\ServiceProvider::class,
],
'aliases' => [
	....
	'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
	'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
],

在vendor文件夹发布的目录运行以下命令:

php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

After install package, configure and publish it vendor then we have required some most important changes. if you don't change it is and forgot then you got following error message when you try to generate HTML to PDF. so, it must be required for all.

步骤四:4个引入改变

安装完包后,配置并发布已经引入了很多的改变vendor目录。如果忘记发布就会得到以下错误信息。

The exit status code '127' says something went wrong:
stderr: "sh: 1: /usr/local/bin/wkhtmltopdf: not found

You all are remember we have also install two dependancy for it. ones you check in your vendor folder then you found this path vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 and another is vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 so, we have required copy wkhtmltoimage-amd64 and wkhtmltopdf-amd64 folder in this path /usr/local/bin/ simply run following command for it.

还记得安装了两个依赖吧。在vendor目录中可以找到一个是vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64,另一个是vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64。然后把它们拷贝到/usr/local/bin以便运行。

注意:改变两个文件夹到777权限

cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/
cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/

Now open your config/snappy.php file and changes in it bith of 'binary' array key following way

打开config/snappy.php文件,按照以下方式更改数组key为binary的值

return array(
    'pdf' => array(
        'enabled' => true,
        'binary'  => '/usr/local/bin/wkhtmltopdf-amd64',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
    'image' => array(
        'enabled' => true,
        'binary'  => '/usr/local/bin/wkhtmltoimage-amd64',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
);

步骤五:创建路由

以上配置完后,在routes/web.php文件创建以下路由:

Route::get('generate-pdf', 'PdfGenerateController@pdfview')->name('generate-pdf');

步骤四:创建控制器

namespace App\Http\Controllers;

use App\Http\Requests;
use Illuminate\Http\Request;
use DB;
use PDF;

class PdfGenerateController extends Controller
{
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function pdfview(Request $request)
    {
        $users = DB::table("users")->get();
        view()->share('users',$users);

        if($request->has('download')) {
        	// pass view file
            $pdf = PDF::loadView('pdfview');
            // download pdf
            return $pdf->download('userlist.pdf');
        }
        return view('pdfview');
    }
}

步骤五:创建视图

现在可以在resources/views/创建一个简单的blade文件,如pdfview.blade.php。通过以下html布局实现pdf转换。

<!DOCTYPE html>
<html>
<head>
	<title>User list - PDF</title>
	<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
	<a href="{{ route('generate-pdf',['download'=>'pdf']) }}">Download PDF</a>
	<table class="table table-bordered">
		<thead>
			<th>Name</th>
			<th>Email</th>
		</thead>
		<tbody>
			@foreach ($users as $key => $value)
			<tr>
				<td>{{ $value->name }}</td>
				<td>{{ $value->email }}</td>
			</tr>
			@endforeach
		</tbody>
	</table>
</div>
</body>
</html>

现在通过运行以下命令可以运行本例了:

php artisan serve

现在可以在浏览器打开以下链接了:

http://localhost:8000

如果你有任何问题或者改进意见可以留言。谢谢。。。

posted @ 2021-07-09 17:32  luyuqiang  阅读(974)  评论(0编辑  收藏  举报