DomPDF:图像不可读或空

26 html php pdf dompdf laravel

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

PDF图片缺失

但是,当图像作为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)

希望能帮助到你

  • 之所以有效,是因为您最初在根目录中查找images目录."./"只表示"查看此目录".你实际上可以删除"./",它仍然可以工作. (3认同)
  • 你统治.我正准备重新排列很多东西!! (2认同)

Jon*_*Jon 11

由于有另一个答案建议启用远程选项module.config.php,我还不能添加注释,我认为最好回答这个文件在较新版本的DomPDF中不存在.

如果您需要在较新版本中包含远程存储的图像,则必须将其作为选项传递给构造函数:

$dompdf = new Dompdf(array('enable_remote' => true));
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.


s3c*_*s3c 8

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)


Bla*_*arl 7

您可以使用 base64 编码的图像

<img src="{{'data:image/png;base64,' . base64_encode(file_get_contents(@$image))}}" alt="image" >
Run Code Online (Sandbox Code Playgroud)

  • 谢了哥们。我试图从 S3 获取图像以在 PDF 中显示。对我来说就像一个魅力 (2认同)

小智 6

现在(2018年5月)的正确方法是:

$options = new Options();
$options->set('isRemoteEnabled',true);      
$dompdf = new Dompdf( $options );
Run Code Online (Sandbox Code Playgroud)