Snappy
Snappy 是一个 PHP 库,可以从 URL 或 HTML 页面生成缩略图、快照或 PDF。它使用了优秀的基于 webkit 的 wkhtmltopdf 和 wkhtmltoimage,可在 OSX、Linux 和 Windows 上使用。
要使用 Snappy,您需要下载 wkhtmltopdf 0.12.x
版本。
在开启新的 issue 之前,请先查看 FAQ。Snappy 是 wkhtmltox 的一个小型封装,因此许多问题已经得到回答、解决或属于 wkhtmltox 的问题。
以下集成可用:
knplabs/knp-snappy-bundle
,用于 Symfonybarryvdh/laravel-snappy
,用于 Laravelmvlabs/mvlabs-snappy
,用于 Zend Framework
使用 Composer 安装
composer require knplabs/knp-snappy
使用方法
初始化
<?php
require __DIR__ . '/vendor/autoload.php';
use Knp\Snappy\Pdf;
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
// 或者您可以分两步完成
$snappy = new Pdf();
$snappy->setBinary('/usr/local/bin/wkhtmltopdf');
在浏览器中显示 PDF
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
header('Content-Type: application/pdf');
echo $snappy->getOutput('http://www.github.com');
从浏览器下载 PDF
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="file.pdf"');
echo $snappy->getOutput('http://www.github.com');
将多个 URL 合并为一个 PDF
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="file.pdf"');
echo $snappy->getOutput(array('http://www.github.com','http://www.knplabs.com','http://www.php.net'));
生成本地 PDF 文件
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
$snappy->generateFromHtml('<h1>账单</h1><p>兄弟,你欠我钱。</p>', '/tmp/bill-123.pdf');
向snappy传递选项
// 输入 wkhtmltopdf -H 查看选项列表
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
$snappy->setOption('disable-javascript', true);
$snappy->setOption('no-background', true);
$snappy->setOption('allow', array('/path1', '/path2'));
$snappy->setOption('cookie', array('key' => 'value', 'key2' => 'value2'));
$snappy->setOption('post', array('key' => 'value'));
$snappy->setOption('cover', 'pathToCover.html');
// .. 或者传递HTML作为封面
$snappy->setOption('cover', '<h1>Bill cover</h1>');
$snappy->setOption('toc', true);
$snappy->setOption('cache-dir', '/path/to/cache/dir');
重置选项
可以使用resetOptions()
方法将选项重置为初始值。
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
// 设置一些选项
$snappy->setOption('copies' => 4);
// ..
// 重置选项
$snappy->resetOptions();
通过composer依赖获取wkhtmltopdf二进制文件
如果你想通过composer下载wkhtmltopdf和wkhtmltoimage,请在composer.json
中添加:
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
然后你可以这样使用:
<?php
use Knp\Snappy\Pdf;
$myProjectDirectory = '/path/to/my/project';
$snappy = new Pdf($myProjectDirectory . '/vendor/h4cc/wkhtmltopdf-i386/bin/wkhtmltopdf-i386');
// 或者
$snappy = new Pdf($myProjectDirectory . '/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64');
注意: 这些静态二进制文件是从Debian7软件包中提取的,因此可能与非Debian基础的Linux发行版不兼容。
一些使用案例
如果你想生成目录并使用自定义XSL样式表,请执行以下操作:
<?php
$snappy = new Pdf('/path/to/binary');
$snappy->setOption('toc', true);
$snappy->setOption('xsl-style-sheet', 'http://path/to/stylesheet.xsl'); //或本地文件
$snappy->generateFromHtml('<p>Some content</p>', 'test.pdf');
错误与支持
如果你发现了bug,请提交一个详细的issue,包含以下所有要点。 如果你需要帮助,请至少提供一个完整的复现示例,这样我们可以基于事实而不是假设来帮助你。
- 操作系统及其版本
- Wkhtmltopdf的版本以及安装方式
- 包含相关PHP和HTML/CSS/JS代码的完整复现示例
如果你的复现示例很大,请尝试缩小它。这将有助于每个人更快地定位bug。
维护者
KNPLabs正在寻找维护者(查看原因)。 如果您有兴趣,欢迎提交拉取请求,申请成为维护者。
我们很高兴能听到您的想法 :)
致谢
Snappy 最初由 KnpLabs 团队开发。