【问题标题】:DOMPDF doesn't work with external css fileDOMPDF 不适用于外部 css 文件
【发布时间】:2013-06-15 15:36:56
【问题描述】:

我正在使用 Zend Framework 和 DOMPDF 库。当我使用内联 css 对其进行测试时,一切正常。但是当我试图将 css 代码移动到外部文件时,规则并没有应用于 html 页面。

这是我的代码。

  1. 生成pdf的控制器操作代码

require_once("DomPdf/dompdf_config.inc.php");

    $this->_helper->layout->disableLayout();

    $html = $this->view->render('index/dom.phtml');

    $dompdf = new DOMPDF();
    $dompdf->load_html($html);
    $dompdf->render();

    $pdfContent =   $dompdf->output();

    file_put_contents('sample.pdf', $pdfContent);

    die("test");

2.对应视图的代码(index/dom.phtml)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link type="text/css" href="/themes/css/pdf.css" rel="stylesheet"   media="screen"/>

</head>
<body>
    <div>Tamara testing</div>
    <table border="1">
        <tr>
            <th>Column 1</th>
            <th>Column 2</th>
        </tr>
        <tr>
            <td>Value 1</td>
            <td>Value 2</td>
        </tr>
    </table>
</body>

</html>

3.还有我的css文件:

div {color: red;}

如何让它发挥作用?

更新:

为了使它正常工作,我更改了以下内容:

1.在控制器的操作中添加外部文件的基本路径

$dompdf->set_base_path(APPLICATION_PATH."/../public/themes/css/");

2.查看更改链接标签的href属性。使其相对于步骤 1 中设置的基本路径。

<link type="text/css" href="pdf.css" rel="stylesheet" />

【问题讨论】:

  • 如果有人在搜索引擎上找到了这个(就像我一样),请注意还有另一个选项叫做DOMPDF::set_protocol(),请参阅下面的答案以获取更多信息。

标签: css zend-framework dompdf


【解决方案1】:

这实际上与 Zend Framework 无关,但您需要为 DomPDF 提供正确的路径以从中加载“外部”文件。

$dompdf = new DOMPDF();
$dompdf->setBasePath(realpath(APPLICATION_PATH . '/path/to/css/'));
$dompdf->loadHtml($html);
$dompdf->render();

有关此功能,另请参阅 DomPDF 的 manual。

【讨论】:

    【解决方案2】:

    @Jurian Sluiman 走在正确的轨道上,但不幸的是,他的回答对我没有帮助。

    我不得不花一些时间来找到适合我的解决方案,即使用DOMPDF::set_protocol():

    $dompdf->set_protocol(WWW_ROOT);
    $dompdf->set_base_path('/');
    

    WWW_ROOT 这是一个 CakePHP constant 指向我的应用程序的 webroot 文件夹。 请注意,它有一个斜杠。

    最好的部分是这似乎是对set_protocol() 的不当使用。但只要它使 CSS 工作,我就可以了。

    希望这可以节省其他人几个小时的时间。

    【讨论】:

    • 谢谢@aexl,这为我节省了很多时间
    • 谢谢,但对我有用的是$options-&gt;setIsRemoteEnabled(true); $options-&gt;setChroot(array_merge($options-&gt;getChroot(), [WWW_ROOT]));。实际上,在设置了Chroot 之后,我什至不需要$dompdf-&gt;setBasePath(WWW_ROOT);,这在阅读文档后符合预期。我认为没有 CHROOT 的安全性是行不通的。检查docs。
    猜你喜欢
    • 2013-08-03
    • 2020-07-12
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多