23

在我的服务器上,通过 dompdf 生成的 pdf 没有显示图像。因为它们是远程 url 图像。(本地图像工作正常)然后我才知道它需要一些设置来渲染远程图像。

allow_url_fopen = true => i can not as server control is not in my hand.(and no one will suggest to do this due to security reasons)
read/write access to the DOMPDF_TEMP_DIR (already have this)
DOMPDF_ENABLE_REMOTE = true (already have this)

因此,为了确定 allow_url_fopen 的问题,我在我的 localhost 中设置了 false,它现在提供与服务器相同的输出。

所以,现在的问题是我想用 allow_url_fopen = false 以 PDF 格式显示远程图像

  • 我尝试了近 5-10 种独特的方法来做到这一点。
  • 我试图在 php 文件中显示图像(通过设置标题),然后在 pdf 中显示 php 链接
  • 我也尝试通过 php 的绝对路径显示图像,但没有任何效果。
  • 我尝试通过函数中的 curl 获取图像,然后将其显示在 php 文件中......但没有运气。

有没有人可以建议我如何在 pdf 中显示图像。我总是得到的错误是......

Image not found
http://localhost/dompdf/image.php

Image not found
http://localhost/dompdf/image.jpg
4

21 回答 21

48

尝试

$options = new Options();
$options->set('isRemoteEnabled', true);
$dompdf = new Dompdf($options);
于 2016-10-26T08:09:39.677 回答
47

我有同样的问题, 在实时服务器上找不到 dompdf 图像

我找到了它的解决方案,你只需要仔细检查图像路径,

考虑您的实时服务器图像路径

<img src="http://www.example.com/public/images/thumb.png">

您只需将其更改为,

<img src="public/images/thumb.png">

注意:确保所有设置都与您所做的相同。

我希望这能帮到您。

于 2014-04-19T10:13:54.860 回答
15

有两件事需要注意。

  1. 如果使用来自同一服务器的图像,则使用完整目录路径,例如 /var/www/html/project_folder/images/logo.jpg

  2. 列表项使用JPEG图像代替png或其他类型。

于 2014-10-20T07:06:02.520 回答
4

在做了很多研发后,我也遇到了同样的问题,终于得到了解决方案。首先,您需要获取 dompdf 的选项,然后设置isRemoteEnabled为 true。

    $options = $dompdf->getOptions(); 
    $options->set(array('isRemoteEnabled' => true));
    $dompdf->setOptions($options);
于 2019-10-06T07:59:14.127 回答
4

我对图像有同样的问题,我的解决方案是:

getcwd().'path/to/image'

这个对我有用!

于 2020-07-28T07:40:49.257 回答
3

转到库/dompdf/scr/option

更改私人 $isRemoteEnabled = false; 到私人 $isRemoteEnabled = true;

于 2020-04-21T23:02:39.057 回答
2

您能否在您用来打开 PDF 的机器上的网络浏览器中访问这些 URL?如果没有,PDF 阅读器也不能。

我怀疑“localhost”域意味着这些 URL 仅在生成 PDF 的 Web 服务器中可见。你需要输出一个像http://example.com/dompdf/image.jpg这样的 url

(要绕过这个问题,请记住有充分的理由不使用远程图像。例如,如果查看器未连接到互联网,文档会看起来很糟糕。是否可以直接将图像嵌入到文档?)

于 2013-03-01T08:13:11.487 回答
2

我想你可以添加这个

private function change_url_image($data, $url) {    
    $str = $url; //for example "http://localhost/yoursite/";
    $str2 = str_replace($str, "", $data);
    return $str2;
}

更改图像的 url

于 2013-12-29T21:40:28.500 回答
2

我给你一个函数的例子

  $html = $this->output->get_output();
        $this->load->library('pdf');
        $this->dompdf->loadHtml($html);
        $this->dompdf->set_option('isRemoteEnabled', true);
        $this->dompdf->setPaper('A4', 'portrait');
        $this->dompdf->render();
        $this->dompdf->stream("studentidcard.pdf", array("Attachment"=>0));

设置 isremoteenabled true 以显示远程图像

于 2019-09-01T10:17:50.533 回答
2

嗨,我对这个问题的解决方案是在我的 php.ini 文件中添加并启用 allow_url_fopen

于 2019-11-17T22:53:09.267 回答
2

这是因为,DOMPDF 无法访问服务器上的图像,请检查您是否添加了任何保护以访问您的网页。

于 2021-03-18T10:24:30.167 回答
2

对于任何在加载图像时遇到问题的人。上述解决方案提到使用绝对路径。但除非您设置 chroot 选项,否则这将不起作用。不会加载 chroot 目录之外的任何文件。将 chroot 设置为从 wordpress 的 wp 内容目录读取的示例:

$options = new Options();    
$options->set( 'chroot', WP_CONTENT_DIR );
$dompdf = new Dompdf( $options );
于 2021-10-20T13:29:04.900 回答
0

dompdf 目前没有区分本地域和远程域的机制,因此任何以 http://... 开头的 URL 都被视为远程。另外,任何使用基于 PHP 的中介(如 pic.php)的图像都不能使用本地路径,因为除非您通过 Web 服务器,否则不会解析 PHP。

这是一个艰难的前景,但您的页面是动态生成的。所以我看到了两个选择:

  1. 下载远程图像并在本地文件系统上链接到它们
  2. 下载远程图像并使用数据 URI。

由于您已经解决了使用 curl 获取图像的问题,因此您应该能够实现其中任何一个。

于 2013-03-01T14:34:29.867 回答
0

我在“dompdf/dompdf_config.inc”中设置了“DOMPDF_ENABLE_REMOTE=>true”但没有工作时遇到了同样的问题。

有一件事对我有用,将图像/css的src从绝对更改为相对,然后事情就完成了。在这种情况下,我的服务器上有所有的 css/图像。

于 2015-01-28T08:10:23.397 回答
0

以防万一有人和我有同样的问题:

  • 我将 src=" https ://" 更改为 src=" http ://" 并且图像加载正常。

  • 我还在 a 中添加了所有内联 CSS,<style>而不是通过加载<link>

  • 并确保 CSS<style>不在<head><body>

于 2018-05-09T01:52:37.190 回答
0

我用了这行代码

<img src="{{ url('/frontened/images/jeevan-green-logo.png') }}" >

它工作正常。谢谢。

于 2019-03-09T08:42:15.093 回答
0
$data = {{any html content with src & href links}}

有时它可能基于不安全的 url 发生,例如https无效的 ssl 证书。因此 dompdf 的渲染器无法访问获取内容的 url。检查您的内容是否有任何不安全的网址。如果您process as unsafe在浏览器中使用带有选项的 url,请使用以下方法。它将 url 替换为 abspath

$url = "https://example.com";
$abspath="/home/public_html/example" || getcwd();
$data =  preg_replace('#(src=\"[\s\r\n]{0,})('.$url.')#','$1'.$abspath, $data);
$data =  preg_replace('#(href=\"[\s\r\n]{0,})('.$url.')#','$1'.$abspath, $data);
于 2020-01-02T07:10:54.810 回答
0

尝试使用带有 .jpg 图像的完整目录路径

我意识到当您远程托管文件时会出现 jpg 图像。

于 2020-10-25T13:11:43.487 回答
0

$pdf=\PDF::loadView('page url',compact('data')); Laravel 穹顶 PDF

    $pdf->getDomPDF()->setHttpContext(
        stream_context_create([
            'ssl' => [
                'allow_self_signed'=> TRUE,
                'verify_peer' => FALSE,
                'verify_peer_name' => FALSE,
            ]
        ])
    );
于 2021-11-26T09:28:20.237 回答
0

DOMPDF 版本 1.1.1

我尝试了上述所有选项,唯一对我有用的方法是:

对于绝对路径(例如:https://website/image.jpg),我必须:

#1 - 使用这些选项:

$options = new Options();
$options->set('isRemoteEnabled', TRUE);
$options->set('tempDir', '/tmp'); //folder name and location can be changed
$dompdf = new Dompdf($options);

#2 -在添加上述行的 php 代码的同一级别创建此tmp文件夹。

对于相对路径(例如:/contents/test_image.jpg),我必须:

#1 - 使用这些选项:

$options = new Options();
$options->set('tempDir', '/tmp');
$options->set('chroot', __DIR__);
$dompdf = new Dompdf($options);

#2 -在添加上述行的 php 代码的同一级别创建此tmp文件夹(如绝对路径)

最后,为了使用绝对路径和相对路径,我的代码是这样的:

<?php

use Dompdf\Dompdf;
use Dompdf\Options;

require __DIR__ . "/vendor/autoload.php";

$options = new Options();
$options->set('isRemoteEnabled', TRUE);
$options->set('tempDir', '/tmp');
$options->set('chroot', __DIR__);

$dompdf = new Dompdf($options);

ob_start();
require __DIR__ . "/contents/my_html.php";
$dompdf->loadHtml(ob_get_clean());


$dompdf->setPaper("A4", "portrait");
$dompdf->render();
$dompdf->stream("file.pdf", ['Attachment' => false]);

我的项目结构是这样的:

pdftest/
  |__contents/
  |  |__my_html.php
  |  |__jpg_test.jpg
  |__tmp/
  |__vendor/* //composer stuff
  |__index.php

我的 html 看起来 index.php 这个

<html>
<header>
    <style>
        body { display:flex; flex-direction:column; align-items: center; justify-content: center; }
        table { border: 1px solid #a1a1a1; }
        table th { border-bottom: 1px solid #a1a1a1; }
    </style>
</header>
<body>
    <table>
        <tr>
            <th>column 1</th>
            <th>column 2</th>
            <th>column 3</th>
            <th>column 4</th>
        </tr>
        <tr>
            <td>Data 1</td>
            <td>
                <img width="40" src="contents/jpg_test.jpg" alt=""/>
                <img width="40" src="https://cdn.pixabay.com/photo/2021/10/14/15/11/cathedral-6709412_960_720.jpg" alt=""/>
            </td>
            <td>Data 3</td>
            <td>Data 4</td>
        </tr>
    </table>
</body>
</html>
于 2022-01-12T22:17:42.820 回答
-3

转到 dompdf_config.inc.php 文件并将变量 DOMPDF_ENABLE_REMOTE 设置为 TRUE ...

于 2013-11-17T16:38:50.943 回答