php DomPDF:图像不可读或为空
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25558449/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
DomPDF: Image not readable or empty
提问by David P. P.
For some reason, DomPDF won't render an image included in the html that is being parsed:
出于某种原因,DomPDF 不会渲染包含在正在解析的 html 中的图像:
However, the image is rendered on the page when it is returned as html:
但是,当图像作为 html 返回时,图像会呈现在页面上:
I've looked at these issues and have make sure that DOMPDF_ENABLE_REMOTE is set to true and verified file permissions:
dompdf image not real image not readable or empty
Image error in DOMPDF for ZF2
我查看了这些问题,并确保 DOMPDF_ENABLE_REMOTE 设置为 true 并验证文件权限:
dompdf image not real image not readable or empty
Image error in DOMPDF for ZF2
Are there any other things that I should be checking for?
还有什么我应该检查的东西吗?
回答by David P. P.
Following helped me like charm, at least localy, and even with
跟随帮助我喜欢魅力,至少在本地,甚至
def("DOMPDF_ENABLE_REMOTE", false);
The solution is to change the image SRC to the absolute path on the server, like this:
解决办法是把图片src改成服务器上的绝对路径,像这样:
<img src="/var/www/domain/images/myimage.jpg" />
All of the following worked for me:
以下所有内容都对我有用:
<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';?>"/>
$_SERVER["DOCUMENT_ROOT"] is C:/wamp/www/ZendSkeletonApplication/public
$_SERVER["DOCUMENT_ROOT"] 是 C:/wamp/www/ZendSkeletonApplication/public
回答by Patrice Flao
Ok I had the same problem with image using :
好的,我在使用图像时遇到了同样的问题:
<img id="logo" src="/images/flags/fr.png" width="50" alt="Logo">
But if I add a . before /images, without changing anything in dompdf_config.custom.inc, it works
但是如果我添加一个 . 在 /images 之前,无需更改 dompdf_config.custom.inc 中的任何内容,它就可以工作
<img id="logo" src="./images/flags/fr.png" width="50" alt="Logo">
Hope it helps
希望能帮助到你
回答by Jon
As there was another answer that suggests enabling the remote option in module.config.php
and I can't yet add comments, I thought it would be best to answer that this file does not exist in newer versions of DomPDF.
由于有另一个答案建议启用远程选项module.config.php
并且我还不能添加评论,我认为最好回答这个文件在较新版本的 DomPDF 中不存在。
If you need to include remotely stored images in a newer version you have to pass it as an option to the constructor:
如果您需要在较新版本中包含远程存储的图像,则必须将其作为选项传递给构造函数:
$dompdf = new Dompdf(array('enable_remote' => true));
This fixed the issue I had.
这解决了我遇到的问题。
回答by André DLC
Now (May 2018) the correct way is :
现在(2018 年 5 月)正确的方法是:
$options = new Options();
$options->set('isRemoteEnabled',true);
$dompdf = new Dompdf( $options );
回答by Owen Davey
回答by BlackPearl
You can use base64 encoded image
您可以使用 base64 编码的图像
<img src="{{'data:image/png;base64,' . base64_encode(file_get_contents(@$image))}}" alt="image" >
回答by Nasser Hekmati
I solve this problem by using external CSS's full path. This one worked on my linux ubuntu server :
我通过使用外部 CSS 的完整路径解决了这个问题。这个在我的 linux ubuntu 服务器上工作:
<link href="{{ public_path('css/style.css') }}" />
<link href="{{ public_path('css/style.css') }}" />
<img src="{{ public_path('images/image.jpg') }}" />
<img src="{{ public_path('images/image.jpg') }}" />
and work on image.
并在图像上工作。
回答by egorychmaster
In path :
在路径中:
vendor/dino/dompdf-module/config/module.config.php
vendor/dino/dompdf-module/config/module.config.php
change settings
更改设置
enable_remote' => false,
enable_remote' => 假,
то true.
是真的。
回答by Japo Domingo
For our use case we had to convert all the images on the page to base64 since the pdf should be usable offline. Our code lives inside a controller class but you can modify that to your needs.
对于我们的用例,我们必须将页面上的所有图像转换为 base64,因为 pdf 应该可以离线使用。我们的代码位于控制器类中,但您可以根据需要对其进行修改。
Here's the code:
这是代码:
/**
* 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 '';
}
}