Giter Club home page Giter Club logo

pdfout's Introduction

PdfOut – PDF Generator(dompdf) & Viewer (pdf.js)

PdfOut stellt den "HTML to PDF"-Converter dompdf und pdf.js in REDAXO zur Verfügung.

Mit dompdf können Ausgaben in REDAXO als PDF generiert, gespeichert und mittels mozilla pdf.js angezeigt werden.

Installation

Die Installation erfolgt über den REDAXO-Installer, alternativ gibt es die aktuellste Beta-Version auf GitHub.

Systemvoraussetzungen

  • DOM-Erweiterung
  • MBString-Erweiterung
  • php-font-lib
  • php-svg-lib
  • gd-lib oder ImageMagick

Bitte beachten: Einige Erweiterungen bringen ebenfalls Abhängigkeiten mit sich, z.B. insbesondere php-svg-lib erfordert sabberworm/php-css-parser.

Zusätzlich empfohlen:

  • OPcache (OPcache, XCache, APC, etc.): verbessert die Leistung
  • GD (für Bildverarbeitung)
  • IMagick- oder GMagick-Erweiterung: verbessert die Bildverarbeitungsleistung
  • Besuchen Sie das Wiki für weitere Informationen: https://github.com/dompdf/dompdf/wiki/Requirements

Erste Schritte

Nach der Installation und Aktivierung kann ein PDF wie folgt erzeugt werden:

  • Den nachfolgenden in ein Template oder Modul einsetzen
  • Der Aufruf erfolgt dann über die Variable pdf=1 die über die URL übergeben wird. Der aktuelle Artikel kann so dann als PDF ausgegeben werden.

Sofern dann an eine aufgerufenen URL ?pdf=1 angehängt wird, wird der Inhalt von REX_ARTICLE[] oder REX_TEMPLATE [] als PDF ausgegeben.

Tipp: Diese Seite als PDF im REDAXO-Backend aufrufen. Der Aufruf klappt nur über das REDAXO Backend. Wenn man hinter die Backend url ?pdftest=1 dranhängt, kommt die README vom Addon.

Beispiel-Code

$print_pdf = rex_request('pdfout', 'int');
if ($print_pdf) {
    $content = '
<style>
    body {
        font-family: "Helvetica"
    }
</style>
REX_ARTICLE[]
';

    $pdf = new PdfOut();

    $pdf->setName('REX_ARTICLE[field=name]')
        ->setFont('Helvetica')
        ->setHtml($content, true)
        ->setOrientation('portrait')
        ->setAttachment(true)
        ->setRemoteFiles(true)
        ->setDpi(300);

    // Save File to path and don't send File
    $pdf->setSaveToPath('/path/to/save/pdf/')->setSaveAndSend(false);

    // execute and generate
    $pdf->run();
}

In diesem Beispiel wird überprüft ob pdfout als Parameter übergeben wurde und der Output von REX_ARTICLE wird als PDF ausgegeben. Möchte man eine gestaltete Ausgabe, kann man ein Template erstellen und alle nötigen Styles dort einbauen und anstelle von REX_ARTICLE[] einsetzen, z.B. REX_TEMPLATE[key=pdf].

Die Abfrage nach einem Request ist optional. Der Aufruf kann überall erfolgen, z.B. auch in einem Extensionpoint oder nach dem Ausfüllen eines Formulars.

Eigenschaften

  • $name: Name der PDF Datei (standardmäßig 'pdf_file')
  • $html: HTML Inhalt, der zu PDF konvertiert werden soll
  • $orientation: Ausrichtung des PDFs ('portrait' oder 'landscape')
  • $font: Standard Schriftart für das PDF ('Dejavu Sans')
  • $attachment: Ob das PDF als Anhang gesendet werden soll (standardmäßig false)
  • $remoteFiles: Ob das Laden von entfernten Dateien im PDF erlaubt ist (standardmäßig true)
  • $saveToPath: Pfad, auf den die PDF Datei gespeichert werden soll (standardmäßig '')
  • $dpi: DPI der erstellten PDF (standardmäßig 100)
  • $saveAndSend: Ob das PDF gespeichert und gesendet werden soll (standardmäßig true)

Methoden

setName(string $name)

Setzt den Namen der PDF Datei.

setHtml(string $html, bool $outputfiler = false)

Setzt den HTML Inhalt, der zu PDF konvertiert werden soll. Wenn $outputfilter auf true gesetzt wird, wird dieser ausgeführt und so z.B. die REDAXO_VARIABLEN verarbeitet.

setOrientation(string $orientation)

Setzt die Ausrichtung des PDFs. Akzeptiert 'portrait' oder 'landscape'.

setFont(string $font)

Setzt die Standard Schriftart für das PDF.

setAttachment(bool $attachment)

Setzt, ob das PDF als Anhang gesendet werden soll.

setRemoteFiles(bool $remoteFiles)

Setzt, ob das Laden von entfernten Dateien im PDF erlaubt ist.

setSaveToPath(string $saveToPath)

Setzt den Pfad, auf den die PDF Datei gespeichert werden soll.

setDpi(int $dpi)

Setzt das DPI der erstellten PDF.

setSaveAndSend(bool $saveAndSend)

Setzt, ob das PDF gespeichert und gesendet werden soll.

run()

Rendert das PDF und sendet es an den Browser oder speichert es im angegebenen Pfad.

Bilder im PDF

Medien die direkt aus dem Medien-Ordner geladen werden, müssen in einem Unterordner des Frontpage-Ordners der Website aufgerufen werden.

Also z.B.: media/image.png

Medien, die über den Mediamanager aufgerufen werden, sollten immer über die volle URL aufgerufen werden.

Also: https://domain.tld/media/media_type/image.png

CSS und Fonts

CSS und Fonts sollten möglichst inline im HTML eingebunden sein. Die Pfade externer Assets können vollständige URls oder Pfade relativ zum des Frontpage-Ordners haben.

Individuelle Einstellung

Es handelt sich hierbei um ein normales domPDF das über den Aufruf new PdfOut() instanziert werden kann.

Mehr dazu bei: dompdf

Hier ist ein Beispiel dafür, wie man die Optionen für domPDF nach der Instanziierung definieren kann, um isFontSubsettingEnabled auf false zu setzen:

   $pdf = new PdfOut();
   
   $options = $pdf->getOptions();
   $options->set('isFontSubsettingEnabled', false);
    
   $pdf->setName('pdf_file')
       ->setFont('Courier')
       ->setHtml($content, true)
       ->setOrientation('portrait')
       ->setAttachment(false)
       ->setRemoteFiles(true);
       ->run();

Tipps

  • Auf die numerische Angabe bei font-weight sollte verzichtet werden.
  • Es empfiehlt sich im verwendeten Template die CSS-Definitionen nicht als externe Dateien sondern inline zu hinterlegen. Dies beschleunigt die Generierung, da keine externen Ressourcen eingelesen werden müssen.
  • Auf Bootsstrap CSS oder andere CSS-Frameworks bei der Ausgabe möglichst verzichten, da zu viele Styles abgearbeitet werden müssen.
  • URLs zu Ressourcen sollten ohne / beginnen und vom Frontpage-Ordner aus definiert sein z.B. media/zyz.jpg oder assets/css/pdf_styles.css. Ein Search & Replace per PHP kann hierbei helfen.
  • Fixierte Divs können zur Anzeige von Fuß und Kopfzeile verwendet werden. Ideal ist es diese direkt nach dem Bodytag zu integrieren. Dann können auch mittels CSS count z.B. Seitenzahlen ausgegegeben werden.
  • Google Fonts zur lokalen Nutzung herunterladen: https://google-webfonts-helper.herokuapp.com/fonts
  • Wenn die eingebettete Schrift beim Drucken nicht korrekt dargestellt wird, die Einstellung "isFontSubsettingEnabled" auf "false" zu setzen.

Medienfiles umschreiben,

die direkt aus dem Media-Verzeichnis ausgelesen werden.

$media = rex_url::media($file); // normal
// wenn pdfout = 1
if(rex_request('pdfout', 'int')) { 
// entfernt Slash am Anfang
$media = ltrim(rex_url::media($file),'/'); 
}

Ausgabe eines PDF mit pdf.js

Mit PdfOut::viewer($file) erhält man den Link zum aufruf des PDF. Es können auch PdfOut-PDF-Ulrs angegeben werrden. Sie müssen nicht mehr speziell encodet werden.

Als Link zum Download

<a href="<?=PdfOut::viewer('/media/pdfdatei.pdf')?>" download>PDF anzeigen</a>
<iframe src="<?=PdfOut::viewer('/media/pdfdatei.pdf')?>"></iframe>

Support & Credits

Wo finde ich weitere Hilfe?

Fragen können im REDAXO-Channel auf Slack gestellt werden.

Autor

Friends Of REDAXO http://www.redaxo.org https://github.com/FriendsOfREDAXO

Projekt-Lead Thomas Skerbis

Wir bedanken uns bei...

Lizenz

MIT-Lizenz

pdfout's People

Contributors

alxndr-w avatar crydotsnake avatar danielweitenauer avatar danspringer avatar dependabot[bot] avatar dpf-dd avatar ebro avatar elricco avatar fanello avatar greatif avatar imgbotapp avatar interweave-media avatar nandes2062 avatar olien avatar schuer avatar skerbis avatar thielpeter avatar ynamite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

pdfout's Issues

Bild-Ausgabe

Ich habe ein Bild/Briefbogen im Hintergrund eingefügt, welches im pdf nicht mit ausgegeben wird.

grafik

& statt ?

Moin,
kann es sein, dass man mit dem Fragezeichen nicht weit kommt? Bei mir funktioniert der Aufruf als PDF so:
<a href="index.php?article_id=114&pdf=1">Dieser Artikel als PDF</a>

Oder mach ich wieder was falsch?

Wunsch: savePdf()

Analog zu sendPdf(); würde ich mich z.B. über ein
savePdf($name = 'pdf_file', $html = '', $path = "pfad/auf/dem/server/");
freuen

PDf wird teilweise im Safari nicht generiert

Hallo,
ich habe hier ein komisches Phänomen. Die PDFs auf einer Seite werden bei meiner lokalen Version überall super generiert, auch im Safari, bei der Live-Seite geht es allerdings nur in Firefox und Chrome, aber nicht in Safari. Php-Version ist quasi identisch (lokal 7.2.1, live 7.2.8) und die Redaxo und Plugin-Version ist selbstverständlich bei beiden Seiten gleich. Gibt es irgendwelche Server-Konfigurationen, die die Funktion des Plugins derart beeinflussen können, oder habt ihr sonst eine Idee?
Link zu einem PDF auf der Live-Seite: https://www.agentur-jovanovic.de/actresses/theresa-bendel/?pdf=1

Warum dompdf in assets

Warum wird die Lib bei der Installation in den Root-Assets-Ordner kopiert, und dann von dort geladen?

Der Assets-Ordner ist eigentlich nicht für PHP-Dateien gedacht, insbesondere da er nicht vor dem direkten Aufruf geschützt ist.

Call to a member function loadHtml() on null

Wenn ich hinter die Url ?pdf=1 Anhänge, kommt der Fehler Call to a member function loadHtml() on null. Es wird auf diese Codezeile verwiesen $dompdf->loadHtml($pdfcontent);

Whoops!

syntax error, unexpected 'use' (T_USE) - Template direkt aus dem Addon-Beispiel kopiert und eingebunden.

<?php
  $print_pdf = rex_request('pdf', 'int');
  if ($print_pdf) {
     // Dompdf laden
     use Dompdf\Dompdf;
     use Dompdf\Options;
      // Optionen festlegen
      $pdf_options = new Options();
      $pdf_options->setDpi(100); // legt die Dpi für das Dokument fest
      $pdf_options->set('defaultFont', 'Helvetica'); // Standard-Font
      // PDF erstellen
      $art_pdf_name =  rex_string::normalize(rex_article::getCurrent()->getValue('name'));
      header('Content-Type: application/pdf');
      $dompdf = new Dompdf($pdf_options);
      $dompdf->loadHtml('REX_ARTICLE[]');
      // Hinweis: Anstelle von REX_ARTICLE[] kann auch ein gestaltetes Template REX_TEMPLATE[XX] angegeben werden
      $dompdf->setPaper('A4', 'portrait');
      $dompdf->render();
      $dompdf->stream($art_pdf_name ,array('Attachment'=>false)); // bei true wird Download erzwungen
      die();
    }
?>

PHP Version >= 7.4

Ein Update auf die aktuelle PDFOut Oopst bei mir mit PHP 7.3, da eine der Komponenten 7.4 vorauasetzt

cmap-Dateien deaktivieren

Description / Beschreibung
Ich benötige kein DomPDF - ich finde die Browser machen da inzwischen einen richtig guten Job in der Darstellung von PDFs.

Trotzdem ist mein Backup und mein assets-Ordner jetzt zugemüllt mit diesen Dateien:

image

Wäre es stattdessen möglich, diese in den Cache-Ordner zu legen? Es handelt sich doch hierbei um eine Art von Cache-Dateien, oder?

Affected versions / Verwendete Versionen

REDAXO:
PHP:
Database:
Browser:
AddOns:

Did it whoops? / Whoops erhalten?

Bilder aus media werden nicht mehr gefunden

In V4.0 werden Bilder, die mit V2.0 noch korrekt in der PDF dargestellt wurden, nicht mehr gefunden.

media/bild.jpg wie in der Doku angegeben hat nicht funktioniert, der absolute URL-Pfad https://domain.de/media/bild.jpg hat nicht geklappt und ich habe keine relative Kombination wie /media/bild.jpg oder ../media/bild.jpg etc gefunden, mit der es geklappt hat.
Downgrade des Addons auf 2.1.0 hat geholfen. Alle Bilder waren dann wieder da.

Rex 5.12.0

Lösung: DomPDF MIT mediamanager-Bildern

Habe eine Lösung gefunden, wie man Mediamanager-Files in Pdfs verwenden kann. Wesentlich ist hierbei eine Einstellung im Template und das Einfügen von der Server-URL, was man auch via OPF lösen könnte.

Modul:

<?php 

$imgs = explode(",","REX_MEDIALIST[1]");
foreach ($imgs as $img) {
    echo "<img src='".rex::getServer()."index.php?rex_media_type=pdf-optimized&rex_media_file=".$img."'><br>";
}
?>

Template:
Habe das Beispiel-Template verwendet. Hier ist der Teil ab Zeile 39 relevant. Neu ist die Option $options->set('isRemoteEnabled', TRUE); - damit wird offenbar das Abrufen von Remote-URL aktiviert.

          // Dateiname 
          $art_pdf_name =  rex_string::normalize(rex_article::getCurrent()->getValue('name'));
          header('Content-Type: application/pdf');
          $options = new Dompdf\Options();
          $options->set('defaultFont', 'Helvetica');
          $options->set('isRemoteEnabled', TRUE);

          $dompdf = new Dompdf\Dompdf($options);
          $dompdf->loadHtml($pre.$pdfcontent.'</body>');
          $dompdf->setPaper('A4', 'portrait');
          $dompdf->render();
          $dompdf->stream($art_pdf_name ,array('Attachment'=>false));
          die();

IMHO könnte man die Anweisungen am Anfang des Templates entsprechend umschreiben, dass die lokale URL via rex::getServer() vorangestellt werden:
$pdfcontent = str_replace("/index.php?rex_media_type=standard&amp;rex_media_file=", "media/", $pdfcontent);

Hoffe, das hilft. Evtl lässt sich das Beispiel-Template entsprechend anpassen und die Option im Addon setzen lassen?

Hilfreich war hierbei für mich dieses Issue: dompdf/dompdf#1118

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.