Dompdf远程图片在PDF中未显示

30

在我的服务器上,通过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的问题,我在本地设置为false,现在输出与服务器相同。

现在的问题是,我想在allow_url_fopen = false的情况下显示远程图片到PDF中

  • 我尝试了5-10种不同的方法。
  • 我尝试通过设置头文件来在php文件中显示图像,然后在pdf中显示php链接。
  • 我也尝试通过绝对路径来显示图像,但都没有效果。
  • 我尝试通过一个函数获取图像,然后在php文件中显示,但没有成功。

请问有谁能建议我如何在pdf中显示图像。我一直得到的错误是...

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

并且

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

你找到任何解决方案了吗?我也遇到了同样的问题,图片在本地主机上显示正常,但在生产服务器上却不行,路径没问题,图片已经存在于服务器上。 - Irfan Ahmed
还没有找到它。 - TechCare99
27个回答

2
你能在打开PDF的机器上使用浏览器访问这些URL吗?如果不能,PDF阅读器也无法访问。
我猜“localhost”域意味着那些URL只能从生成PDF的Web服务器上看到。你需要输出像http://example.com/dompdf/image.jpg 这样的URL。
(为了避免这个问题,要记得有很好的理由不使用远程图像。例如,如果视图者未连接到互联网,则文档将看起来很差。是否可以直接嵌入图像到文档中?)

在这里,用户正在查看我的网站并动态生成PDF文件,例如,我在PDF中显示了他的个人资料图片。(profilepic位于CDN服务器上) 因此,我可以提供链接,如cdnserver.com/user/12.jpg或myserver.com/user_profiles/pic.php?id=12两种方式都不起作用,并且用户具有Internet访问权限。 - TechCare99

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

2

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


2
我将为您提供一个与函数相关的例子。"Original Answer"翻译成中文是"最初的回答"。
  $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 可以显示远程图像。最初的回答。

set_option已被弃用。 - Mark Anthony Libres

1

我使用Symfony,通过两个步骤解决了我的问题:

  1. 在domPdf选项中启用isRemoteEnabled选项
  2. 在twig上放置绝对url

以下是更详细的回答: 我的stackoverflow更详细的回答

希望能对您有所帮助。


0
实际问题出在远程服务器dompdf无法显示.png,但.jpg可以, 我认为简单的解决方法是,
$extension = substr('1.png', - 4);
    if($extension == '.png' || $extension == '.PNG')
    {
        //convert image png to jpg, because dompdf png not working on Remote Server.
        $image = imagecreatefrompng('1.png');
        imagejpeg($image, '1.png', 100);
        $profileimage = '1.jpg';
        
    }

在生成 PDF 后,您可以取消链接上述临时 JPG 文件。


0

$pdf = \PDF::loadView('页面网址', compact('数据')); Laravel 生成 PDF

    $pdf->getDomPDF()->setHttpContext(
        stream_context_create([
            'ssl' => [
                'allow_self_signed'=> TRUE,
                'verify_peer' => FALSE,
                'verify_peer_name' => FALSE,
            ]
        ])
    );

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

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

这是一个困难的前景,但您的页面是动态生成的。因此,我看到两个选择:

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

由于您已经通过curl获取了图像,因此应该能够实现其中任何一个。


0

我也遇到了同样的问题,当我在“dompdf/dompdf_config.inc”中设置“DOMPDF_ENABLE_REMOTE => true”时,它并没有起作用。

有一件事对我有用 将图像/ CSS 的src绝对路径改为相对路径,问题就解决了。在这种情况下,我所有的CSS / 图像都在我的服务器上。


0

以防万一,如果有其他人遇到和我一样的问题:

  • 我把 src="https://" 改成了 src="http://" ,然后图片就正常加载了。

  • 我也把所有的 CSS 都内嵌在 <style> 标签里而不是通过 <link> 加载。

  • 同时确保 CSS 的 <style> 标签在 <head> 而不是 <body> 里面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接