PDF-Generator dompdf und pdf.js für REDAXO
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.
Die Installation erfolgt über den REDAXO-Installer, alternativ gibt es die aktuellste Beta-Version auf GitHub.
Bitte beachten: Einige Erweiterungen bringen ebenfalls Abhängigkeiten mit sich, z.B. insbesondere
php-svg-lib
erfordertsabberworm/php-css-parser
.
Zusätzlich empfohlen:
Nach der Installation und Aktivierung kann ein PDF wie folgt erzeugt 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.
$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.
$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)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.
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 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.
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();
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),'/');
}
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>
Fragen können im REDAXO-Channel auf Slack gestellt werden.
Friends Of REDAXO http://www.redaxo.org https://github.com/FriendsOfREDAXO
Projekt-Lead Thomas Skerbis
Wir bedanken uns bei...