DomPDF: Bild nicht lesbar oder leer

Lesezeit: 6 Minuten

Aus irgendeinem Grund rendert DomPDF kein Bild, das in der zu analysierenden HTML-Datei enthalten ist:

PDF-Bild fehlt

Das Bild wird jedoch auf der Seite gerendert, wenn es als HTML zurückgegeben wird:

HTML-Bild existiert

Ich habe mir diese Probleme angesehen und sichergestellt, dass DOMPDF_ENABLE_REMOTE auf true und verifizierte Dateiberechtigungen eingestellt ist:
dompdf image not real image nicht lesbar oder leer
Bildfehler in DOMPDF für ZF2

Gibt es noch andere Dinge, die ich überprüfen sollte?

  • Ist die PHP-Einstellung allow_url_fopen auf wahr setzen? Wenn Sie 0.6.x verwenden, können Sie dompdf/www/setup.php laden, um zu sehen, ob Ihre Installation rote Markierungen enthält.

    – BrianS

    12. September 2014 um 2:59 Uhr

Benutzer-Avatar
David PP

Das Folgen half mir wie Charme, zumindest lokal, und sogar mit

define("DOMPDF_ENABLE_REMOTE", false);

Die Lösung besteht darin, den Bild-SRC wie folgt auf den absoluten Pfad auf dem Server zu ändern:

<img src="/var/www/domain/images/myimage.jpg" />

Bei mir hat alles folgende funktioniert:

<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”] ist C:/wamp/www/ZendSkeletonApplication/public

Dank dessen: lost in code

  • Das Konvertieren des Bildes in base64 funktioniert für mich $imageUrl = (string) Image::make(public_path($path)) ->fit(80, 80) ->encode('data-url');

    – Olotin Temitop

    30. Oktober 2018 um 18:21 Uhr


  • Das Hinzufügen eines absoluten Pfads funktionierte für mich anstelle eines relativen Pfads.

    – Niles Pansuriya

    30. Juli 2020 um 9:55 Uhr

Benutzer-Avatar
Jon

Da es eine andere Antwort gab, die vorschlägt, die Remote-Option in zu aktivieren module.config.php und ich noch keine Kommentare hinzufügen kann, dachte ich, es wäre am besten zu antworten, dass diese Datei in neueren Versionen von DomPDF nicht existiert.

Wenn Sie remote gespeicherte Bilder in eine neuere Version einbinden müssen, müssen Sie dies als Option an den Konstruktor übergeben:

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

Dies hat das Problem behoben, das ich hatte.

  • Hat für mich auf Laravel funktioniert, danke

    – ynsmtkl

    5. Juli 2021 um 22:30 Uhr

  • Dies funktionierte für mich mit Remote-Images. Ich danke Ihnen für das Teilen!

    – vanari

    13. August 2021 um 22:13 Uhr


  • enable_remote hat Synonyme, erwähnt in github.com/dompdf/dompdf/blob/master/src/Options.php: elseif($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') {$this->setIsRemoteEnabled($value);}

    – Arja

    30. Juli um 17:50 Uhr


Ok, ich hatte das gleiche Problem mit dem Bild mit:

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

Aber wenn ich eine hinzufüge. vor /images, ohne etwas in dompdf_config.custom.inc zu ändern, es funktioniert

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

Ich hoffe es hilft

  • Der Grund, warum es funktioniert hat, ist, dass Sie ursprünglich nach dem Bilderverzeichnis im Stammverzeichnis suchen. Das “./” bedeutet einfach “in diesem Verzeichnis suchen”. Sie könnten tatsächlich das “./” entfernen und es wird immer noch funktionieren.

    Benutzer3562712

    3. Dezember 2014 um 20:15 Uhr

  • du entscheidest. Ich war dabei, eine Menge Sachen neu zu ordnen!!

    – Chad Caldwell

    22. Juli 2016 um 20:02 Uhr

  • Nach all diesen Versuchen habe ich … das ist die Lösung!

    – Markus

    16. August 2016 um 3:40 Uhr


Jetzt (Mai 2018) ist der richtige Weg:

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

Sie können base64-codierte Bilder verwenden

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

  • Danke, Mate. Ich habe versucht, ein Bild von S3 zur Anzeige im PDF zu bekommen. Hat bei mir wie am Schnürchen funktioniert 😁

    – Omer

    18. April 2021 um 22:03 Uhr

Brauchst du nicht wirklich isRemoteEnabled eingeschaltet, wenn sich alle Ihre Bilder und was nicht auf demselben Server befinden, der das Skript ausführt.

Warum es Ihr Bild nicht lädt

DomPdf schützt Sie davor, dadurch angegriffen zu werden. Gem Dokumentation Folgendes wird nicht funktionieren:

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

Sie sollten CHROOT mit in Ihren gewünschten absoluten Pfad ändern

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

und dann können Sie beliebige einfügen <img> mit src von innen (kann verschachtelt werden) das /public Ordner in HTML.

Sicherheitshinweis

Es scheint ein einfacher Gewinn zu sein, Chroot einfach in Ihren App-Stammordner zu setzen, aber nicht. Es öffnet ein böses Tor, eines, das du geschlossen halten willst. Angeblich sind keine kritischen Skripte drin /publicnur Bilder, öffentliche Dokumente, Routing etc.

Nutzungshinweis

Beachten Sie, dass ich ein anderes Verzeichnistrennzeichen als das in der Dokumentation verwendete verwendet habe. ich glauben Die beste Vorgehensweise wäre, etwas in der folgenden Zeile zu tun:

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

  • Danke, Mate. Ich habe versucht, ein Bild von S3 zur Anzeige im PDF zu bekommen. Hat bei mir wie am Schnürchen funktioniert 😁

    – Omer

    18. April 2021 um 22:03 Uhr

Ich löse dieses Problem, indem ich den vollständigen Pfad des externen CSS verwende. Dieser funktionierte auf meinem Linux-Ubuntu-Server:

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

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

und am Bild arbeiten.

  • Geben Sie bei der Bereitstellung von Beispielcode diesen bitte als Beispiel an, um das Problem für den Fragesteller zu beheben. (IE-Beispielcode mit einem vollständigen Pfad zu einem Bild und nicht zu einem Stylesheet, da es bei dieser Frage um ein Bild geht.)

    – Loren

    17. Januar 2018 um 12:37 Uhr

1099150cookie-checkDomPDF: Bild nicht lesbar oder leer

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy