DomPDF: imagen no legible o vacía

6 minutos de lectura

Por alguna razón, DomPDF no mostrará una imagen incluida en el html que se está analizando:

Falta la imagen PDF

Sin embargo, la imagen se representa en la página cuando se devuelve como html:

La imagen HTML existe

Revisé estos problemas y me aseguré de que DOMPDF_ENABLE_REMOTE esté configurado en permisos de archivo verdaderos y verificados:
imagen dompdf no imagen real no legible o vacía
Error de imagen en DOMPDF para ZF2

¿Hay otras cosas que debería estar revisando?

  • Es la configuración de PHP allow_url_fopen establecido en verdadero? Si está utilizando 0.6.x, puede cargar dompdf/www/setup.php para ver si hay marcas rojas en su instalación.

    – BrianS

    12 de septiembre de 2014 a las 2:59

Seguir me ayudó como el encanto, al menos localmente, e incluso con

def("DOMPDF_ENABLE_REMOTE", false);

La solución es cambiar el SRC de la imagen a la ruta absoluta en el servidor, así:

<img src="https://stackoverflow.com/var/www/domain/images/myimage.jpg" />

Todo lo siguiente funcionó para mí:

<img src="https://stackoverflow.com/questions/25558449/<?php echo $_SERVER["DOCUMENT_ROOT"].'/placeholder.jpg';?>"/>
<img src="https://stackoverflow.com/questions/25558449/<?php echo $_SERVER["DOCUMENT_ROOT"].'\placeholder.jpg';?>"/>
<img src="https://stackoverflow.com/questions/25558449/<?php echo $_SERVER["DOCUMENT_ROOT"].'./placeholder.jpg';?>"/>

$_SERVIDOR[“DOCUMENT_ROOT”] es C:/wamp/www/ZendSkeletonApplication/public

Gracias a esto: perdido en el código

  • Convertir la imagen a base64 funciona para mí. $imageUrl = (string) Image::make(public_path($path)) ->fit(80, 80) ->encode('data-url');

    – Temitopo de Olotín

    30 oct 2018 a las 18:21


  • Agregar la ruta absoluta funcionó para mí en lugar de la ruta relativa.

    – Nilesh Pansuriya

    30 de julio de 2020 a las 9:55

avatar de usuario
Jon

Como había otra respuesta que sugiere habilitar la opción remota en module.config.php y aún no puedo agregar comentarios, pensé que sería mejor responder que este archivo no existe en las versiones más nuevas de DomPDF.

Si necesita incluir imágenes almacenadas de forma remota en una versión más nueva, debe pasarla como una opción al constructor:

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

Esto solucionó el problema que tenía.

  • Trabajó para mí en Laravel, gracias

    – ynsmtkl

    5 julio 2021 a las 22:30

  • Esto funcionó para mí con imágenes remotas. ¡Gracias por compartir!

    – vanaria

    13 de agosto de 2021 a las 22:13


Ok, tuve el mismo problema con la imagen usando:

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

Pero si agrego un . antes de /images, sin cambiar nada en dompdf_config.custom.inc, funciona

<img id="logo" src="https://stackoverflow.com/questions/25558449/./images/flags/fr.png" width="50" alt="Logo">

Espero eso ayude

  • La razón por la que funcionó es porque originalmente está buscando el directorio de imágenes en la raíz. El “./” simplemente significa “buscar en este directorio”. De hecho, podría eliminar el “./” y aún funcionará.

    usuario3562712

    03/12/2014 a las 20:15

  • tú gobiernas ¡Estaba a punto de reorganizar muchas cosas!

    – Chad Caldwell

    22 de julio de 2016 a las 20:02

  • Después de todos estos intentos que di… ¡esta es la solución!

    – Marc

    16 de agosto de 2016 a las 3:40


Ahora (mayo de 2018) la forma correcta es:

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

Puede usar una imagen codificada en base64

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

  • Gracias amigo. Estaba tratando de obtener una imagen de S3 para mostrarla en el PDF. Funcionó como un encanto para mí 😁

    – Omer

    18 abr 2021 a las 22:03

Realmente no necesitas isRemoteEnabled activado, si todas sus imágenes y demás están en el mismo servidor que ejecuta el script.

Por qué no carga tu imagen

DomPdf te protege de ser atacado a través de él. según documentación lo siguiente no funcionará:

$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);

Debe cambiar CHROOT a su ruta absoluta deseada con

$dompdf->getOptions()->setChroot("C:\\laragon\\www\\your-local-website\\public");

y luego puedes insertar cualquier <img> con src desde dentro (se puede anidar) que /public carpeta en HTML.

nota de seguridad

Parece una victoria fácil configurar Chroot en la carpeta raíz de su aplicación, pero no. Abre una puerta desagradable, una que quieres mantener cerrada. Supuestamente no hay guiones críticos en /publicsolo imágenes, documentos públicos, enrutamiento, etc.

nota de uso

Tenga en cuenta que usé un separador de directorio diferente al que se usa en la documentación. yo creer la mejor práctica sería hacer algo en líneas de:

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);

  • Gracias amigo. Estaba tratando de obtener una imagen de S3 para mostrarla en el PDF. Funcionó como un encanto para mí 😁

    – Omer

    18 abr 2021 a las 22:03

Resuelvo este problema usando la ruta completa de CSS externo. Este funcionó en mi servidor linux ubuntu:

<link href="https://stackoverflow.com/questions/25558449/{{ public_path("css/style.css') }}" />

<img src="https://stackoverflow.com/questions/25558449/{{ public_path("images/image.jpg') }}" />

y trabajo en la imagen.

  • Cuando proporcione un código de muestra, proporciónelo como ejemplo para solucionar el problema para el autor de la pregunta. (IE Ejemplo de código con una ruta completa a una imagen en lugar de una hoja de estilo ya que esta pregunta es sobre una imagen).

    – Lorena

    17 de enero de 2018 a las 12:37

¿Ha sido útil esta solución?