Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DomPDF:图像不可读或为空_Php_Html_Pdf_Laravel_Dompdf - Fatal编程技术网

Php DomPDF:图像不可读或为空

Php DomPDF:图像不可读或为空,php,html,pdf,laravel,dompdf,Php,Html,Pdf,Laravel,Dompdf,出于某些原因,DomPDF不会呈现包含在正在解析的html中的图像: 但是,图像以html形式返回时会在页面上呈现: 我已经研究了这些问题,并确保DOMPDF\u ENABLE\u REMOTE设置为true并验证了文件权限: 还有什么我应该检查的吗?好的 我在使用图像时遇到了同样的问题: <img id="logo" src="/images/flags/fr.png" width="50" alt="Logo"> 但如果我加一个。在/images之前,在dompdf

出于某些原因,DomPDF不会呈现包含在正在解析的html中的图像:

但是,图像以html形式返回时会在页面上呈现:

我已经研究了这些问题,并确保DOMPDF\u ENABLE\u REMOTE设置为true并验证了文件权限:

还有什么我应该检查的吗?

好的 我在使用图像时遇到了同样的问题:

<img id="logo" src="/images/flags/fr.png" width="50" alt="Logo">

但如果我加一个。在/images之前,在dompdf_config.custom.inc中不做任何更改,它可以工作

<img id="logo" src="./images/flags/fr.png" width="50" alt="Logo">


希望这对我有帮助

以下帮助我喜欢魅力,至少在当地,甚至在

def("DOMPDF_ENABLE_REMOTE", false);
解决方案是将映像SRC更改为服务器上的绝对路径,如下所示:

<img src="/var/www/domain/images/myimage.jpg" />

以下所有这些都对我有用:

<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';?>"/>
“/>
"/>
"/>
$\u服务器[“DOCUMENT\u ROOT”]是C:/wamp/www/zendskletonapplication/public

路径中的:

vendor/dino/dompdf module/config/module.config.php

更改设置

启用_remote'=>false


是的。

这里没有一个解决方案对我有效。相反,我只是对图像进行base64编码,然后它就起作用了。你可以使用这个。

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

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

$dompdf = new Dompdf(array('enable_remote' => true));

这解决了我的问题。

我通过使用外部CSS的完整路径解决了这个问题。这个在我的linux ubuntu服务器上运行:

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

$options = new Options();
$options->set('isRemoteEnabled',true);      
$dompdf = new Dompdf( $options );

对于我们的用例,我们必须将页面上的所有图像转换为base64,因为pdf应该可以脱机使用。我们的代码存在于控制器类中,但您可以根据需要修改它

代码如下:


    /**
     * Convert images to Base64 so it's included in the PDF.
     *
     * @param $html  Full html render of the page.
     */
    public function convertReportImagesToURI($html): string
    {
        $doc = new DOMDocument();
        libxml_use_internal_errors(true);
        $doc->loadHTML($html);
        $tags = $doc->getElementsByTagName('img');
        $imgArr = array();

        // Iterate over all image tags.
        foreach ($tags as $tag) {
            // Get the src attribute.
            $imgSrc = $tag->getAttribute('src');

            // Convert to base64.
            $base64src = self::getImageDataURI($imgSrc);
            $tag->setAttribute('src', $base64src);
        }
        return $doc->saveHTML();
    }

    /**
     * This does the actual encoding.
     */
    public static function getImageDataURI($image, $mime = ''): string
    {
        // Director::absoluteURL('/') gets the base url of the site.
        // We had to remove the leading slash of the image hence the use of substr.
        // If your images have absolute urls you will need to modify this.
        $imageLocation = Director::absoluteURL('/') . substr($image, 1);
        // Get the image location. remove leading slash on image url.
        return 'data:' . self::get_image_mime_type($imageLocation) . ';base64,' . base64_encode(file_get_contents($imageLocation));
    }

    /**
     * https://stackoverflow.com/a/45054843
     * @param $image_path
     * @return string
     */
    public static function get_image_mime_type($image_path): string
    {
        $mimes  = array(
            IMAGETYPE_GIF => "image/gif",
            IMAGETYPE_JPEG => "image/jpg",
            IMAGETYPE_PNG => "image/png",
            IMAGETYPE_SWF => "image/swf",
            IMAGETYPE_PSD => "image/psd",
            IMAGETYPE_BMP => "image/bmp",
            IMAGETYPE_TIFF_II => "image/tiff",
            IMAGETYPE_TIFF_MM => "image/tiff",
            IMAGETYPE_JPC => "image/jpc",
            IMAGETYPE_JP2 => "image/jp2",
            IMAGETYPE_JPX => "image/jpx",
            IMAGETYPE_JB2 => "image/jb2",
            IMAGETYPE_SWC => "image/swc",
            IMAGETYPE_IFF => "image/iff",
            IMAGETYPE_WBMP => "image/wbmp",
            IMAGETYPE_XBM => "image/xbm",
            IMAGETYPE_ICO => "image/ico");

        if (($image_type = exif_imagetype($image_path))
            && (array_key_exists($image_type, $mimes))) {
            return $mimes[$image_type];
        } else {
            return '';
        }
    }

您可以使用base64编码图像

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

如果所有图像和其他图像都位于执行脚本的同一服务器上,则实际上不需要打开
isRemoteEnabled

为什么它不加载你的图像 DomPdf可保护您免受攻击。根据以下说明,此功能无效:

$dompdf=newdompdf();
$dompd->getOptions()->getChroot();//类似于'C:\\laragon\\www\\your local website\\vendor\\dompd\\dompd'
$html=setChroot(“C:\\laragon\\www\\your local website\\public”);
然后您可以将
/public
文件夹中的任何
(可以嵌套)插入HTML

安全说明 只需将Chroot设置到应用程序根文件夹似乎是一个轻松的胜利,但不要。这会打开一扇你想关上的难关。据推测,
/public
中没有关键脚本,只有图像、公共文档、路由等

使用说明 请注意,我使用的目录分隔符与文档中使用的目录分隔符不同。我认为最好的做法是按照以下行进行操作:

define('DS',目录\分隔符);
$public=ABSPATH.DS.'public';//ABSPATH被定义为应用程序根文件夹中的_DIR_
$image=$public.DS.'logo.DS.'logo-md.png';
/*可选的*/
$saveLocation=ABSPATH.DS'....DS.'private'.DS.'invoices';//请注意,保存位置不必位于'/public'(甚至不必位于'www'中)
$html=loadHtml($html,'UTF-8');
$domPdf->setPaper('A4','肖像');
$domPdf->render();
/*或者*/
$domPdf->stream($filename);//文件名是可选的
/*或*/
$outputString=$domPdf->output();
$pdfFile=fopen($saveLocation,'w');
fwrite($pdfFile,$outputString);
fclose($pdfFile);

PHP设置
allow\u url\u fopen
是否设置为true?如果您使用的是0.6.x,您可以加载dompdf/www/setup.PHP以查看安装中是否有任何红色标记。之所以有效,是因为您最初在根目录中查找images目录。“/”仅表示“查找此目录”。您实际上可以删除./“这仍然有效,由你来统治。我正要重新安排很多东西!!在我尝试了这么多之后。。。这就是解决办法!我也是。所有的解决方案都不起作用。在上一次尝试base64时,由于此注释,它起到了作用。对于较新版本,您指定此设置的方式显然发生了变化:在提供示例代码时,请将其作为示例提供,以解决询问者的问题。(即,示例代码带有图像的完整路径,而不是样式表,因为这个问题是关于图像的。)将图像转换为base64对我来说是可行的
$imageUrl=(string)image::make(public_path($path))->fit(80,80)->encode('data-url')添加绝对路径而不是相对路径对我有效。这非常有效!谢谢谢谢,伙计。我试图从S3中获取一个图像,并将其显示在PDF中。对我来说很有魅力