由于某种原因,DomPDF 不会渲染正在解析的 html 中包含的图像:
但是,当图像以 html 返回时,图像会呈现在页面上:
我已经查看了这些问题,并确保 DOMPDF_ENABLE_REMOTE 设置为 true 并验证了文件权限:
dompdf 图像不是真实图像,无法读取或为空
ZF2 的 DOMPDF 中的图像错误
还有其他我应该检查的事情吗?
以下帮助我喜欢魅力,至少在当地,甚至与
define("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';?>"/>
$_SERVER["DOCUMENT_ROOT"] 是 C:/wamp/www/ZendSkeletonApplication/public
由于另一个答案建议在
module.config.php
中启用远程选项,并且我还无法添加评论,我认为最好回答该文件在较新版本的 DomPDF 中不存在。
如果您需要在较新版本中包含远程存储的图像,则必须将其作为选项传递给构造函数:
$dompdf = new Dompdf(array('enable_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">
希望有帮助
您可以使用base64编码的图像
<img src="{{'data:image/png;base64,' . base64_encode(file_get_contents(@$image))}}" alt="image" >
现在(2018年5月)正确的方法是:
$options = new Options();
$options->set('isRemoteEnabled',true);
$dompdf = new Dompdf( $options );
如果您的所有图像以及其他图像都位于执行脚本的同一服务器上,那么您实际上并不需要打开
isRemoteEnabled
。
DomPdf 保护您免受通过它的攻击。根据文档,以下内容将不起作用:
$dompdf = new Dompdf();
$dompdf->getOptions()->getChroot(); // something like 'C:\\laragon\\www\\your-local-website\\vendor\\dompdf\\dompdf'
$html = <<<HTML
<!DOCTYPE html>
<html lang="en">
<body>
<img src="C:\\laragon\\www\\your-local-website\\public\\img\\logo.png">
</body>
</html>
HTML;
$dompdf->loadHtml($html);
您应该将 CHROOT 更改为您想要的绝对路径
$dompdf->getOptions()->setChroot("C:\\laragon\\www\\your-local-website\\public");
然后您可以将任何带有
<img>
的 src
从该 /public
文件夹内(可以嵌套)插入到 HTML 中。
将 Chroot 设置为应用程序根文件夹似乎是一个简单的胜利,但不要。它打开了一扇令人讨厌的大门,而你却想把它关上。据说
/public
中没有关键脚本,只有图像、公共文档、路由等
请注意,我使用了与文档中使用的目录分隔符不同的目录分隔符。我相信最好的做法是做以下事情:
define('DS', DIRECTORY_SEPARATOR);
$public = ABSPATH . DS . 'public'; // ABSPATH is defined to be __DIR__ in root folder of your app
$image = $public . DS . 'logo' . DS . 'logo-md.png';
/* Optional */
$saveLocation = ABSPATH . DS . '..' . DS . 'private' . DS . 'invoices'; // Note that save location doesn't have to be in '/public' (or even in 'www')
$html = <<<HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
* {
font-family: DejaVu Sans !important;
}
@page {
margin: 0;
padding: 0;
}
html, body {
margin: 0;
min-height: 100%;
padding: 0;
}
</style>
</head>
<body>
<img src="{$image}">
</body>
</html>
HTML;
$dompdf = new Dompdf();
$dompdf->getOptions()->setChroot($public);
$domPdf->loadHtml($html, 'UTF-8');
$domPdf->setPaper('A4', 'portrait');
$domPdf->render();
/* either */
$domPdf->stream($filename); // filename is optional
/* or */
$outputString = $domPdf->output();
$pdfFile = fopen($saveLocation, 'w');
fwrite($pdfFile, $outputString);
fclose($pdfFile);
我通过使用外部CSS的完整路径解决了这个问题。这个可以在我的 linux ubuntu 服务器上运行:
<link href="{{ public_path('css/style.css') }}" />
<img src="{{ public_path('images/image.jpg') }}" />
并处理图像。
这里的解决方案都不适合我。相反,我只是对图像进行 Base64 编码,然后它就起作用了。您可以使用这个工具。
对于我们的用例,我们必须将页面上的所有图像转换为 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 '';
}
}
我在加载本地图像时遇到了这个问题并发现了
$dompdf->getOptions()->setChroot($path_to_images);
还不够,我还必须设置
chdir($path_to_images);
在路径中:
供应商/dino/dompdf-module/config/module.config.php
更改设置
enable_remote' => false,
то 是的。
在 DomPDF 中嵌入图像的 100% 有效解决方案:
<img src="data:image/png;base64,{{ base64_encode(file_get_contents(public_path($image->path))) }}" class="app-image-style"/>
说明:
将
data:image/png;base64,{{ base64_encode(file_get_contents(public_path($image->path))) }}
合并为 src
标签的 <img>
属性可以将图像无缝嵌入到 DomPDF 生成的文档中。
此方法需要:
数据 URI 格式:
data:image/png;base64,
格式表示图像在 HTML 文档本身中表示为 Base64 编码的字符串。
Base64 编码:
base64_encode(file_get_contents(public_path($image->path)))
获取并编码位于 $image->path
的指定图像文件的二进制数据。然后将此编码字符串用作图像源。
注意: 如果您仍然遇到问题,请验证您的
document/image
路径。
此方法解决了利用
package:dompdf/dompdf
生成 PDF 时面临的问题,确保图像成功嵌入到生成的 PDF 文档中。
该方法被证明可以有效解决 DomPDF 中的图像渲染问题,并有助于在生成的 PDF 中顺利集成图像。