dompdf:找不到图像或类型未知

问题描述 投票:0回答:11

这是我的代码, 我几乎尝试了所有在 PDF 上显示图像的方法,但仍然不起作用。 你能帮我解决这个问题吗? 我还将 DOMPDF_ENABLE_REMOTE 设置为 true,结果仍然相同。

require_once("dompdf/autoload.inc.php");
//require('WriteHTML.php');
$html = '<body>
 <div id="watermark"><img src="/var/htdocs/PDF/header.png" height="100%" width="100%"></div>
  <div id="header">
    <h3 style="padding-top:10px;">'.$_POST['name'].'</h3>
  </div>
  <div id="footer">
    <h3 style="padding-top:8px; padding-right:25px;" class="CIJ">ABSOLUTE MARKET INSIGHTS</h3>
  </div>
   <div>
    <br><br><div class="ooo" style="padding-top: 20px;">'.$_POST['comment'].'</div>
  </div>
</body>';

use Dompdf\Dompdf;
$dompdf = new Dompdf();
$canvas = $dompdf->get_canvas();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream($_POST["name"], array("Attachment" => false));
php html twitter-bootstrap dompdf
11个回答
18
投票

您需要添加 'isRemoteEnabled' => true

return PDF::setOptions(['isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true])->loadView('reports.invoiceSell')->stream();

9
投票

您应该使用完整的 URL 而不是直接路径。特别是当它不是静态图像时:dompdf将直接打开该php脚本,因此它不会像PHP脚本一样执行。

如果完整的 URL 不起作用,您还可以显示 header.php 的结果是什么。需要记住的一些好处是发送正确的内容类型标头等等。


8
投票

我终于找到了可以与任何服务器一起使用的正确解决方案 -> 在 Img src 属性中使用 Base64 :)


7
投票

您可以验证一下错误是否是因为Dompdf版本的安全问题:

$path = 'NameImage.jpg';
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);

此代码会将您的图像“转换为 Base64 格式”。这解决了我的问题:)


4
投票

我尝试了几种不同的解决方案并想分享我是如何解决这个问题的。

  1. 在“供应商”目录中找到:“找不到图像或类型未知”(对我来说是:/vendor/dompdf/dompdf/src/Image/Cache.php)

public static $error_message =“图像未找到或类型未知”;

  1. 之后您会在同一个文件中找到一处使用此错误消息的地方。

  2. 您可能需要在修改文件之前更改该文件的权限,为此您可以使用:

sudo chmod -R 777 ./供应商

  1. 通过在 catch('} catch (ImageException $e) {') 内部添加以下内容来修改文件:

$message = $e->getMessage();

dump($e->getMessage());死;

  1. 尝试构建 PDF。现在您应该看到更详细的报告(不要忘记将这些更改改回来...)。

  2. 我收到有关 chroot 问题的错误。我尝试更改图像的 chroot,但这没有帮助,因为在服务器和本地主机中对我来说有不同的 chroot,所以我像这样修改了它:

     $options = new Options();
     $options->setChroot('');
    
     $dompdf = new Dompdf();
     $dompdf->setOptions($options);
     $dompdf->loadHtml($html, 'UTF-8');
     $dompdf->render();
    

3
投票

在 1.0.2 版本中有效的另一种选择是对文件进行更改。

dompdf/src/Image/Cache.php

将变量 ($chrootValid) 设置为 true

$chrootValid = true;

*在这种情况下,您无法获得完整路径


1
投票

在 mac 上,会产生以下错误,但在 Dompdf 中不会显示此错误消息。

“无法在 /var/folders/cc/nxb7r62n4vb0dds455ss6pw0000gn/T 中创建临时映像”

$options = new Options();
$options->setTempDir('temp'); // temp folder with write permission

$dompdf = new Dompdf();
$dompdf->setOptions($options);

0
投票

您是否尝试过完整路径/网址:

<img src="http://domain.com/var/htdocs/PDF/header.png" height="100%" width="100%">

或者使用更多变量的解决方案:

$baseurl = "http://www.domain.com";
echo '<img src="' . $baseurl . '/var/htdocs/PDF/header.php" height="100%" width="100%">';

0
投票

我尝试了上面的所有其他解决方案 - 但唯一对我有用的是将图像保留在 dompdf 文件夹中,然后从该文件夹引用它们。


0
投票

最后我得到了适用于任何服务器的正确解决方案 - >在 Img src 属性中使用 Base64,如下所示:

<img src="{{$variable['signature']}}" />

0
投票

您应该首先转到您的图像源。在那里,只需添加服务器链接、本地主机链接或您正在使用的任何内容。

例如,假设您使用的是本地主机,那么只需在之前添加它即可:

<img 
    src="https://i.stack.imgur.com/ADiZy.jpg?s=256&g=1" 
    height="100px" 
    width="100px"
>
</div>

然后,在控制器或我们添加

$dompdf->load_html($html);
的库中,只需添加:

$dompdf->set_option('isRemoteEnabled', true);
© www.soinside.com 2019 - 2024. All rights reserved.