Benutzer-Werkzeuge

Webseiten-Werkzeuge


users:werner:pdfoutput

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

users:werner:pdfoutput [2006-10-04 0832]
werner Hinweis auf doku>users:wflamme:pdfex
users:werner:pdfoutput [2008-08-23 0952] (aktuell)
werner andere Links zu Dokuwiki
Zeile 1: Zeile 1:
 +====== Seiteninhalt als PDF ======
 +
 +Oft möchte man den Inhalt einer Seite als PDF-Datei auf seinem Rechner haben. Wer nun keinen PDF-Drucker installiert hat, kann auf PDF-Dateien zugreifen, die vom Server bereitgestellt werden. Dazu muss man am [[doku>​wiki:​dokuwiki|Dokuwiki]]-Code einige kleine Änderungen vornehmen.
 +
 +Ich habe mich für einen Weg entschieden,​ der aus dem Seiteninhalt eine Datei erzeugt. Dadurch, dass ich keine druckaufbereiteten Daten benutze, sieht das Ergebnis anders aus als wenn man es über den Drucken-Button des Webbrowsers ausgibt.
 +
 +Zunächst habe ich mich bei der Umsetzung für [[http://​html2fpdf.sourceforge.net|HTML2FPDF]] entschieden. Es ist nicht so leistungsfähig wie andere Tools, aber es erfordert außer PHP keine weitere Software auf dem Webserver -- ein Vorteil, wenn man für seinen Webauftritt nur Webspace hat und keinen eigenen Server.
 +
 +Ich lasse das Tool eine PDF-Datei erzeugen und baue einen Link zum Herunterladen in die Fußzeile.
 +
 +Zuerst muss ich dazu das verwendete Template betrachten: wo wird der Inhalt ausgegeben und wo soll der Link entstehen? Ich benutze ein leicht verändertes [[doku>​wiki:​tpl:​ach|ACH]]-Template. Dort -- in der Datei ''​main.php''​ -- findet sich eine Passage ''<?​php tpl_content()?>'',​ die ich benutze, um mir den Inhalt der Seite, fertig aufbereitet,​ in eine Variable zu speichern: ''<?​php $myhtml = tpl_content();​ ?>''​.
 +
 +Nun muss ich die Datei ''​inc/​template.php''​ bearbeiten -- sie enthält die Funktion tpl_content() --, damit ich wirklich den Inhalt zurück erhalte. Deshalb füge ich am Ende eine Zeile ein: ''​return $html_output;''​.
 +
 +Dadurch ist sichergestellt,​ dass ich den Inhalt auch wirklich erhalte. Nun muss er ausgegeben werden. Das kann nur unterhalb der Stelle im Template erfolgen, an der ich diesen Inhalt erfasst habe -- in meinem Fall in der Fußzeile. Dort trage ich folgenden Code ein:
 +<code php>
 +  <?php
 +    // Umwandlung Inhalt -> PDF-Datei
 +    include(DOKU_INC . '​inc/​html2fpdf/​cPDF.php'​);​
 +    $destdir = DOKU_INC . '​tmp';​
 +    if (! @is_dir($destdir)) @mkdir($destdir);​
 +    $leaveTime = 60 * 60 * 24;
 +    if (@is_dir($destdir)) {
 +      if ($dh = @opendir($destdir)) {
 +        while (($file = @readdir($dh)) !== false) {
 +          if (time() - @filemtime($file) > $leaveTime) @unlink($file);​
 +        } // while (($file = @readdir($dh)) !== false)
 +        @closedir($dh);​
 +      } // if ($dh = @opendir($destdir))
 +    } // if (@is_dir($destdir))
 +    $tempf1 = @tempnam($destdir,​ '​PDF_'​);​
 +    $tempf2 = strtolower($tempf1 . '​.pdf'​);​
 +    $linkname = DOKU_BASE . '​tmp/'​ . basename($tempf2);​
 +    @link($tempf1,​ $tempf2);
 +    @unlink($tempf1);​
 +    @chmod($tempf2,​ 0664);
 +    $mycss = '​http://'​ . $_SERVER['​SERVER_NAME'​] . DOKU_BASE . '​lib/​exe/​css.php?​print=1';​
 +    $myPDFsize = HTMLzuPDF($myhtml,​ $tempf2, $mycss);
 +  ?>
 +</​code><​code html>
 +  <a <?php echo $tgt; ?> 
 +     ​href="<?​php echo $linkname; ?>" ​
 +     ​title="<?​php echo $lang['​txt_domepdf'​];​ ?>">​
 +    <img style="​border:​0;" ​
 +         ​src="<?​php echo DOKU_TPL; ?>​images/​button-pdf.png" ​
 +         ​width="​80"​ height="​15" ​
 +         ​alt="<?​php echo $lang['​txt_domepdf'​];​ ?>" ​
 +         ​title="<?​php echo $lang['​txt_domepdf'​];​ ?>" />
 +  </a>
 +</​code>​
 +
 +Kurze Erläuterung:​ zunächst sorge ich per ''​include()''​ dafür, dass mir die Funktion ''​HTMLzuPDF()''​ zur Verfügung steht. Dann lege ich das Verzeichnis fest, in dem die PDF-Dateien abgelegt werden; falls es nicht besteht, wird es angelegt. Dann folgt ein Intermezzo: ich durchsuche das Verzeichnis nach Dateien, die älter als ''​$leaveTime''​ Sekunden sind -- diese werden gelöscht. Dann lege ich eine temporäre Datei an; um damit arbeiten zu können, muss ich sie in Kleinbuchstaben umwandeln und die Endung ''​.pdf'' ​ anhängen. Der Zugriffsmodus wird gesetzt. Die letzte PHP-Codezeile bewirkt dann die Umwandlung in PDF.
 +
 +Der HTML-Teil darunter zeigt ein Beispiel für das Erstellen eines Links auf diese Datei. ​
 +
 +Tja, damit bin ich bald fertig. Fehlt nur noch das Zurechtbasteln eines kleinen Icons für die Schaltfläche unten -- und der Eintrag von ''​$lang['​txt_domepdf'​]''​ in die Datei ''​lang.php''​ -- mindestens einmal im Unterverzeichnis ''​lang/​en''​ des Templates, ich habe zusätzlich noch eine deutsche Übersetzung eingetragen ;-)
 +
 +===== Bekannte Probleme =====
 +
 +  * Bilder werden auf Grund der Art und Weise, wie die Links im Quelltext stehen, nicht ins PDF übernommen. Stattdessen erscheint der Platzhalter.
 +  * relative Links (also innerhalb des DokuWiki) werden zwar als Link erkannt und von HTML2FPDF auch umgesetzt, jedoch als ''​file://''​ statt ''​http://''​.
 +  * Smileys werden nicht angezeigt (wie Bilder), jedoch wird an dieser Stelle die Zeile umbrochen.
 +  * Die CSS-Fähigkeiten von HTML2FPDF sind ... ausbaufähig... z. B. wird ''​display:​ none;''​ ignoriert.
 +
 +===== Neue Wege =====
 +
 +Auf [[doku>​plugin:​pdfdownload]] wurde ich darauf hingewiesen,​ dass das Vorgehen unzweckmäßig ist. Daraufhin habe ich es umgestrickt und auf [[doku>​plugin:​pdfex]] beschrieben -- deutsche Fassung in diesem Wiki folgt :-)
  
users/werner/pdfoutput.txt · Zuletzt geändert: 2008-08-23 0952 von werner