DOMPDF无法使用外部CSS文件。

13

我正在使用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(),请参见我的答案以获取更多信息。 - ᴍᴇʜᴏᴠ
3个回答

13

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

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

有关此功能,请参阅DomPDF的手册


6

@Jurian Sluiman的回答是正确的,但不幸的是并没有帮助到我。

我花了一些时间才找到适合我的解决方案,那就是使用DOMPDF::set_protocol()

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

WWW_ROOT在这里是一个指向我的应用程序webroot文件夹的CakePHP常量请注意,它有一个尾随斜杠。

最好的部分是,这似乎是set_protocol()的不当使用。但只要它能使CSS工作,我就没问题。

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


谢谢@aexl,这节省了我很多时间。 - DatsunBing
谢谢,但对我有用的是$options->setIsRemoteEnabled(true); $options->setChroot(array_merge($options->getChroot(), [WWW_ROOT]));。实际上,在设置了Chroot之后,我甚至不需要$dompdf->setBasePath(WWW_ROOT);,这符合文档中的预期。我认为如果没有CHROOT,它将无法保证安全性。请查看文档 - Fr0zenFyr

0
除了 @Jurian Sluiman 的答案之外,我还必须允许 Dompdf 访问基本路径,以便 CSS 样式和图像正常工作:
$dompdf = new Dompdf(['chroot' => __DIR__]);
$dompdf->setBasePath(__DIR__ . '/path/to/assets/'));
$dompdf->loadHtml($html);
$dompdf->render();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接