PDF: Dynamisches Wasserzeichen mit HTML->PDF Overlay

Bevor ihr weiterlest (Update: 11.12.2011):

Das mit dem HTML-Dokument als Print-Vorlage war nur ein ehr mittelmäßiger Ansatz… glücklicherweise hat sich eine neue Möglichkeit aufgetan, wie man PDFs von einer besseren Formatvorlage (SVG) erstellen kann. Mehr dazu hier.

Ich habe eine relative elegante Lösung gefunden, wie man PDFs mit ein paar Tricks mit dynamischen Wasserzeichen versehen kann. Bei der ursprünglichen Aufgabenstellung wollte jemand Daten aus einem Numbers-Sheet auslesen und dementsprechend Logos und Texte als Wasserzeichen zu PDFs hinzufügen.

Das mit dem Wasserzeichen ist ja mit pdftk recht leicht zu bewerkstelligen und auch das abgleichen der Daten mit den PDF-Namen war ein leichtes. Etwas schwieriger war da schon das automatische Layouten der Datensätze in ein PDF. Man kann so etwas bestimmt mit Quark oder Indesign machen, nur stehen mir diese Programme leider nicht zu Verfügung und zudem produzieren die Dinger einen ganz schönen Overhead und der Rechner ist in der Zeit komplett blockiert.

Stattdessen habe ich mir für einen günstigere Variante (php, ruby-> wkpdf) quergedacht, da die PDFs sowieso nur für den Online-Gebrauch erstellt werden sollen und nicht für den Druck.


Die notwendigen Tools:

  • Zunächst installiert man sich pdftk (am besten direkt von hier, denn da gibt es einen gebrauchsfertigen Installier (funktioniert für 10.6 und 10.7)
  • nun braucht man noch wkdpf, ein Ruby-Gem, mit dem man HTML-Seiten als PDF rendern lassen kann. Dazu wird die WebkitEngine genutzt
    Die Installation erfolgt einfach über das eine Code-Zeile im Terminal:sudo gem update --system; sudo gem install wkpdf;gem update wkpdf
  • Eine dynamisch anpassbare HTML-Datei, über die das Layout des PDF-Overlays definiert wird. Ich habe hierzu anfänglich PHP genutzt, im Beispiel nutze ich stattdessen schnödes AppleScript, welches eine HTML-Datei ausliest und diese angepasst ausgibt.

Ein Beispiel

Anbei eine Zip-Datei mit einem Beispiel-Skript. Die Funktionsweise ist einfach gehalten:

  1. Skript starten und wählt auf Nachfrage ein PDF und die HTML-Datei aus
  2. Nun wird noch der Inhalt der zu erzeugenden Überschrift abgefragt
  3. Die eingegebenen Überschrift wird zusammen mit dem aktuellen Datum in das HTML-Layout eingebaut und in eine Datei geschrieben (quick&dirty)
  4. wkpdf schnappt sich die HTML-Datei und erstell daraus ein PDF
  5. pdftk verwurstet alle in ein neues PDF und dies wir anschließend geöffnet

[Download not found]

--hubionmac 09.12.2011
--adds a dynamic overlay/background to a pdf
-- requires:
-- wkpdf: http://plessl.github.com/wkpdf/
-- pdftk: http://www.pdflabs.com/docs/install-pdftk/
-- a working html file with "blafasel" place holders for the dynamic data ;-)
-- tested Mac OS 10.7.2 
--wir brauchen die Datei-Pfade und die Daten für das Overlay
set thepdf to quoted form of POSIX path of (choose file of type {"pdf"})
set thelayout to quoted form of POSIX path of (choose file) --of type "html funktioniert irgendwie nicht
set headline to text returned of (display dialog "Bitte Überschrift eingeben:" default answer "Toller Titel")
set thedate to do shell script "date '+Datum:  %d.%m.%Y'"
set thedata to {headline, thedate}
--Die Daten werden in den HTML-Code eingebaut
set htmlsource to do shell script "cat " & thelayout
set AppleScript's text item delimiters to "blafasel"
set htmlparts to every text item of htmlsource
set AppleScript's text item delimiters to ""
set myoutput to {}
repeat with i from 1 to count of thedata
set myoutput to myoutput & itemi of htmlparts & itemi of thedata
end repeat
if (count of htmlparts) > (count of thedata) then
set myoutput to myoutput & items (count of thedata) through -1 of htmlparts
end if
--der angepasste HTML-Code wir in eine Datei geschrieben
do shell script "echo " & quoted form of (myoutput as text) & " > " & thelayout & ".data.html"
--wkpdf erstellt aus dieser Datei ein PDF
do shell script "wkpdf --output " & thelayout & ".data.pdf --source " & thelayout & ".data.html --paper a4 --orientation portrait --print-background --paginate false"
--PDFTK nimmt sich das erstellte PDF und fügt es als background zum eigentlichen PDF hinzu und am Ende wird das Ergebnis im geöffnet
do shell script "/opt/pdflabs/pdftk/bin/pdftk " & thepdf & " background " & thelayout & ".data.pdf output " & thepdf & ".overlayed.pdf flatten;open " & thepdf & ".overlayed.pdf"

									

Wissenswert

Der einzige richtige Stolperstein ist eigentlich das HTML-Style-Sheet und die Parameter von wkpdf.
Das Layout der HTML-Datei sollte am besten exakt der Größe des Ausgangs-PDFs angepasst werden und wkpdf sollte die richtige Größe -paper, -margin, –orientation mitbekommen… insbesondere der Parameter –paginate false macht einem das ganze leichter, da so der Output (also das Wasserzeichen) stets nur aus einer Seite besteht.

Bei pdftk muss man sehen wie das am besten funktioniert ob mit stamp oder background. Das PDF von wkdpf ist glücklicherweise transparent, bis auf die Bereich mit HTML-Objekten, die weisen anscheinend stets einen Hintergrund auf.

One thought on “PDF: Dynamisches Wasserzeichen mit HTML->PDF Overlay

  1. […] Auf diese Art lassen sich schnell (ohne GUI) PDFs erstellen, die anders als bei der wkpdf-Lösung auch über einen Transparente Hintergrund verfügen. Ich habe jetzt kein direktes Beispiel zur […]

Leave a Reply