26 html php pdf dompdf laravel
出于某种原因,DomPDF不会渲染正在解析的html中包含的图像:

但是,当图像作为html返回时,图像将在页面上呈现:

我已经查看了这些问题,并确保将DOMPDF_ENABLE_REMOTE设置为true并验证文件权限:
dompdf image not real image not reading or empty
DOMPDF for ZF2中的图像错误
还有其他我应该检查的东西吗?
小智 45
以下帮助我喜欢魅力,至少是localy,甚至是
def("DOMPDF_ENABLE_REMOTE", false);
Run Code Online (Sandbox Code Playgroud)
解决方案是将映像SRC更改为服务器上的绝对路径,如下所示:
<img src="/var/www/domain/images/myimage.jpg" />
Run Code Online (Sandbox Code Playgroud)
以下所有内容对我有用:
<img src="<?php echo $_SERVER["DOCUMENT_ROOT"].'/placeholder.jpg';?>"/>
<img src="<?php echo $_SERVER["DOCUMENT_ROOT"].'\placeholder.jpg';?>"/>
<img src="<?php echo $_SERVER["DOCUMENT_ROOT"].'./placeholder.jpg';?>"/>
Run Code Online (Sandbox Code Playgroud)
$ _SERVER ["DOCUMENT_ROOT"]是C:/ wamp/www/ZendSkeletonApplication/public
Pat*_*lao 12
好的我使用的图像有同样的问题:
<img id="logo" src="/images/flags/fr.png" width="50" alt="Logo">
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加一个.之前/图像,而不改变dompdf_config.custom.inc中的任何内容,它的工作原理
<img id="logo" src="./images/flags/fr.png" width="50" alt="Logo">
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你
Jon*_*Jon 11
由于有另一个答案建议启用远程选项module.config.php,我还不能添加注释,我认为最好回答这个文件在较新版本的DomPDF中不存在.
如果您需要在较新版本中包含远程存储的图像,则必须将其作为选项传递给构造函数:
$dompdf = new Dompdf(array('enable_remote' => true));
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题.
isRemoteEnabled如果您的所有图像以及其他图像都位于执行脚本的同一服务器上,则实际上不需要打开。
DomPdf 可以保护您免受通过它的攻击。根据文档,以下内容将不起作用:
$dompdf = new Dompdf();
$dompdf->getOptions()->getChroot(); // something like 'C:\\laragon\\www\\your-local-website\\vendor\\dompdf\\dompdf'
$html = <<<HTML
<!DOCTYPE html>
<html lang="en">
<body>
<img src="C:\\laragon\\www\\your-local-website\\public\\img\\logo.png">
</body>
</html>
HTML;
$dompdf->loadHtml($html);
Run Code Online (Sandbox Code Playgroud)
您应该将 chroot 更改为您想要的绝对路径
$dompdf->getOptions()->setChroot("C:\\laragon\\www\\your-local-website\\public");
Run Code Online (Sandbox Code Playgroud)
然后您可以将该文件夹中的任何<img>内容src(可以嵌套)插入/public到 HTML 中。
将 Chroot 设置为您的应用程序根文件夹似乎是一个简单的胜利,但不要这样做。它打开了一扇令人讨厌的大门,而你却想把它关上。据说 中没有关键脚本/public,只有图像、公共文档、路由等。
请注意,我使用了与文档中使用的目录分隔符不同的目录分隔符。我相信最好的做法是做以下事情:
define('DS', DIRECTORY_SEPARATOR);
$public = ABSPATH . DS . 'public'; // ABSPATH is defined to be __DIR__ in root folder of your app
$image = $public . DS . 'logo' . DS . 'logo-md.png';
/* Optional */
$saveLocation = ABSPATH . DS . '..' . DS . 'private' . DS . 'invoices'; // Note that save location doesn't have to be in '/public' (or even in 'www')
$html = <<<HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
* {
font-family: DejaVu Sans !important;
}
@page {
margin: 0;
padding: 0;
}
html, body {
margin: 0;
min-height: 100%;
padding: 0;
}
</style>
</head>
<body>
<img src="{$image}">
</body>
</html>
HTML;
$dompdf = new Dompdf();
$dompdf->getOptions()->setChroot($public);
$domPdf->loadHtml($html, 'UTF-8');
$domPdf->setPaper('A4', 'portrait');
$domPdf->render();
/* either */
$domPdf->stream($filename); // filename is optional
/* or */
$outputString = $domPdf->output();
$pdfFile = fopen($saveLocation, 'w');
fwrite($pdfFile, $outputString);
fclose($pdfFile);
Run Code Online (Sandbox Code Playgroud)
您可以使用 base64 编码的图像
<img src="{{'data:image/png;base64,' . base64_encode(file_get_contents(@$image))}}" alt="image" >
Run Code Online (Sandbox Code Playgroud)
小智 6
现在(2018年5月)的正确方法是:
$options = new Options();
$options->set('isRemoteEnabled',true);
$dompdf = new Dompdf( $options );
Run Code Online (Sandbox Code Playgroud)