使用打印布局将HTML页面保存为PDF

时间:2016-03-29 15:37:15

标签: javascript pdf zend-framework cross-browser

我想允许我的用户将我的页面保存为PDF。我创建了一个打印样式表,我可以使用Javascript' print函数生成PDF。这是我的问题:

Chrome 中,浏览器会生成预览并将其显示给用户。然后,用户可以保存或打印它。

但是,在IE和FF中,print会调出一个复杂的菜单,而 可以通过"打印"来生成PDF。对于PDFCreator来说,这是一个很复杂的过程,很多用户都不会理解。

我想要做的是以某种方式复制非Chrome用户的Chrome功能。我考虑过的选项:

  • 屏幕截图HTML页面并使用Javascript将该图像渲染为PDF。有些库可以执行此操作,但我希望我的PDF具有打印布局。
  • 在服务器上生成PDF并将其发送到用户的浏览器。这可以做到,但似乎很难使用与标准页面相同的HTML。

我的服务器正在运行PHP和Zend框架。我无法在服务器上使用NodeJS或任何无头浏览器进行渲染。我有任何选择吗?

1 个答案:

答案 0 :(得分:3)

在使用名为dompdf(https://github.com/dompdf/dompdf)的库之前,我已经完成了您想要做的事情。以下是我如何使用它:

我将dompdf库放入ZF项目的“library”文件夹中。然后,在我准备渲染页面的应用程序中,我创建了一个新的Zend_View()对象,并使用它需要的任何视图脚本变量进行设置。然后我调用render()函数并将渲染的输出存储到变量中,然后提供给dompdf。代码如下所示:

        $html = new Zend_View();
        $html->setScriptPath(APPLICATION_PATH . '/views/scripts/action_name/');
        $html->assign($data); //$data contains the view variables I wanted to populate.
        $bodyText = $html->render('pdf_template.phtml');
        require_once(APPLICATION_PATH."/../library/dompdf/dompdf_config.inc.php");
        $dompdf = new DOMPDF();
        $dompdf->load_html($bodyText);
        // Now you can save the rendered pdf to a file or stream to the browser:
        $dompdf->stream("sample.pdf");

        // Save to file:
        $dompdf->render();
        $pdf = $dompdf->output();
        file_put_contents($filename, $pdf);