使用PHP将HTML生成PDF或图片:采用 laravel-snappy

1,241 阅读2分钟

barryvdh/laravel-snappy 笔记:

再次强调,laravel-snappy 是对 knplabs/knp-snappy 的 laravel 集成,而底层使用的是 wkhtmltopdf/wkhtmltoimage 包

1.安装 wkhtmltopdf
	1>从 wkhtmltopdf 官方安装:
		https://wkhtmltopdf.org/downloads.html

	2>作为 composer 的依赖来安装:
		https://github.com/KnpLabs/snappy#wkhtmltopdf-binary-as-composer-dependencies

		32位系统:
			composer require h4cc/wkhtmltopdf-i386 0.12.x
			composer require h4cc/wkhtmltoimage-i386 0.12.x

		64位系统:
			composer require h4cc/wkhtmltopdf-amd64 0.12.x
			composer require h4cc/wkhtmltoimage-amd64 0.12.x				

	注意:
		我们系统,可能缺少一些依赖包,例如:libXrender,我们需要自己手动安装

2.测试 wkhtmltopdf 安装是否成功
	直接在命令行运行 wkhtmltopdf 命令

	使用第二种方式来安装(作为 composer 依赖安装),安装后的目录位于:
		/vendor/h4cc/wkhtmltoimage-amd64/bin
		/vendor/h4cc/wkhtmltopdf-amd64/bin

	注意:
		vagrant 用户需要进行如下操作,来避免出现的 126 报错:
			1>将下载的二进制软件,移动到不在同步文件夹中的路径,例如:
				cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/
				cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/

			2>添加可执行权限:
				chmod +x /usr/local/bin/wkhtmltoimage-amd64 
				chmod +x /usr/local/bin/wkhtmltopdf-amd64

3.barryvdh/laravel-snappy 安装 & 使用
	1>composer 安装:
		composer require barryvdh/laravel-snappy

	laravel 5.5 已经使用了包自动发现,我们不需要手动添加 'ServiceProvider/Facade'。如果使用了 'laravel-dompdf',可能会产生冲突。这种情况下,需要手动来注册 Facade,来解决这个问题(没打算使用,有使用的,万一冲突了,记得这个提示!)

	2>config/app.php
		providers:
			Barryvdh\Snappy\ServiceProvider::class,

		aliases:
			'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
			'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,

	3>发布配置文件:
		php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

		配置文件中,我们主要是需要修改,wkhtmltopdf 和 wkhtmltoimage 的路径

	4>使用:
		1.使用 App 容器:
			$snappy = App::make('snappy.pdf');
			$html = '<h1>dongxuemin</h1>';

			// 从 HTML 字符串生成 PDF
			$snappy->generateFromHtml($html, '/tmp/test.pdf');

			// 从 URL 链接生成 PDF
			$snappy->generate('http://www.github.com', '/tmp/test.php');

			// 获取转换后的 PDF 字符串
			$pdf_response = $snappy->getOutputFromHtml($html);
			// 直接输出到浏览器下载
			return response($pdf_response, 200, [
		        'Content-Type'          => 'application/pdf',
		        'Content-Disposition'   => 'attachment; filename="file.pdf"'
			]);

		2.使用封装(wrapper):
			$pdf = App::make('snappy.pdf.wrapper');
			$html = '<h1>dongxuemin</h1>';

			// 加载 HTML
			$pdf->loadHTML($html);
			return $pdf->inline();

		3.使用 Facade:

			// 从 blade 模板加载
			$pdf = PDF::loadView('invoice.blade.php', $view_data)
			return $pdf->download('invoice.pdf');

			// 链式调用:
			return PDF::loadFile('http://www.github.com')->inline('github.pdf');

			// 改变方向和纸张大小
			PDF::loadHTML($html)
				->setPaper('a4')					// 纸张大小
				->setOrientation('landscape')		// 方向
				->setOption('margin-bottom', 0)		// 其他设置
				->save('myfile.pdf');				// 存储
				// ->output();						// 得到输出字符串

		4.更多信息和参数设置,参考 wkhtmltopdf 文档:
			http://wkhtmltopdf.org/usage/wkhtmltopdf.txt

4.总结完后,实战操作了下:
	mac 系统使用 '第二种' 安装方法,报错:
		/xxx/wkhtmltopdf-amd64 cannot execute binary file
	搜索了半天,没找到有用的解决方法,只有采用 '第一种' 安装方法,官网下载软件包