在Symfony 1.4中从HTML / CSS / PHP生成PDF

时间:2013-06-25 09:57:04

标签: php pdf-generation symfony-1.4

我正在研究Symfony 1.4项目。我需要为(尚未)生成的凭证制作PDF下载链接,我不得不说,我有点困惑。我已经有凭证的HTML / CSS,我在右侧视图中创建了下载按钮,但我不知道从那里去哪里。

4 个答案:

答案 0 :(得分:0)

Use Mpdf to create the pdf file
http://www.mpdf1.com/

答案 1 :(得分:0)

如果可能,请使用wkhtmltopdf。它是迄今为止php编码器可以使用的最好的html2pdf转换器。

然后做这样的事情(没有经过测试,但应该非常接近):

public function executeGeneratePdf(sfWebRequest $request) 
{
    $this->getContext()->getResponse()->clearHttpHeaders();

    $html = '*your html content*';
    $pdf = new WKPDF();
    $pdf->set_html($html);
    $pdf->render();

    $pdf->output(WKPDF::$PDF_EMBEDDED, 'whatever_name.pdf');

    throw new sfStopException();
}

答案 2 :(得分:0)

+1与wkhtmltopdf

我甚至建议使用snappy库。 如果您使用composer,您甚至可以自动获取wkhtmltopdf二进制文件

答案 3 :(得分:0)

我已经使用了wkhtmltopdf一段时间后我已经离开了它1)它有一些严重的错误和2)正在进行的开发已经放慢了速度。我转移到PhantomJS,这在功能和效率方面证明要好得多。

在您的计算机上安装了wkhtmltopdf或PhantomJS之后,您需要生成HTML页面并将其传递给它。假设你使用PhantomJS,我会给你一个例子。

最初为模板设置所需的每个请求参数。

$this->getRequest->setParamater([some parameter],[some value]);

然后调用函数getPresentation()从模板生成HTML。这将返回特定模块和操作的结果HTML。

$html = sfContext::getInstance()->getController()->getPresentation([module],[action]);

您需要在HTML文件中使用绝对CSS路径替换相对CSS路径。例如,通过运行preg_replace

$html_replaced = preg_replace('/"\/css/','"'.sfConfig('sf_web_dir').'/css',$html);

现在将HTML页面写入文件并转换为PDF。

$fp = fopen('export.html','w+');
fwrite($fp,$html_replaced);
fclose($fp)
exec('/path/to/phantomjs/bin/phantomjs /path/to/phantomjs/examples/rasterize.js /path/to/export.html /path/to/export.pdf "A3");

现在将PDF发送给用户:

$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setHttpHeader('Content-Description','File Transfer');
$this->getResponse()->setHttpHeader('Cache-Control','public, must-revalidate, max-age=0');
$this->getResponse()->setHttpHeader('Pragma: public',true);
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding','binary');
$this->getResponse()->setHttpHeader('Content-length',filesize('/path/to/export.pdf'));
$this->getResponse()->setContentType('application/pdf');
$this->getResponse()->setHttpHeader('Content-Disposition','attachment; filename=export.pdf');

$this->getResponse()->setContent(readfile('/path/to/export.pdf'));
$this->getResponse()->sendContent();

你需要设置标题,否则浏览器会做奇怪的事情。生成的HTML文件和导出的文件名应该是唯一的,以避免两个人同时生成PDF凭证的情况发生冲突。您可以使用类似sha1(time())的内容将随机哈希添加到标准名称,例如'export_'.sha1(time());