html2pdf.xsl

XSL-FO für die Westentasche

für Facharbeiten, Hausaufgaben, Anleitungen, etc

Layman's L@tex

weil Wörd so kompliziert ist...

demonstriert und integriert die Open Source Tools

Apache FOP, Saxon und HTML Tidy

Motivation

Dieses Programm ist ein Trainingsprojekt für meinen neuen Job! Seit März 2008 bin ich Vollzeit XSLT Programmierer (ja, sowas gibt es ;-) Falls mich mal der Hafer sticht und ich nochmal eine Studienarbeit anfertigen sollte, werde ich mich nicht mehr Wörd oder Open Office herumärgern sondern ein XSL-FO Stylesheet programmieren, so wie dieses hier...

Technik

Aus einem relativ unformatierten HTML Dokument wird mittels einer XSL Transformation XSL Transformation, kurz XSLT, ist eine Programmiersprache zur Transformation von XML-Dokumenten. Sie ist Teil der Extensible Stylesheet Language (XSL) und stellt eine turing-vollständige Sprache dar... (mehr dazu auf Wikipedia) ein strukturiertes PDF Dokument generiert, mit Kapitelnummerierung, automatisch generierten Verzeichnissen für Inhalt, Abbildungen und Fussnoten. Weiterhin gibt es "running header" im Kopfbereich jeder Seite und eine Cover Seite. Das Format ist einerseits für einen zweiseitigen Druck ausgelegt (Die Abstände zum Seitenrand sind bei linker und rechter Seite verschieden und es gibt einen "Bundsteg".). Dieses Format wird mit book.bat erzeugt. andererseits gibt es aber auch die Möglichkeit ein PDF mit weniger Formatierungen zu generieren (paper.bat).

Systemanforderungen

Betriebssystem:

Programmiersprachen:

Selbstverständlich sollte das Programm auch unter einem anderen Betriebssystem laufen, nachdem die Komponenten der Software mit Java realisiert sind. Aber dann müssen die Start-Batchskripte angepasst werden. Hier übernehme ich keinen "Support" ;-)

Komponenten der Software

Es wird ausschliesslich Open Source Software Open source (engl.) bzw. quelloffen ist Software, die unter einer von der Open Source Initiative (OSI) anerkannten Lizenz steht. Die OSI stützt sich bei der Bewertung auf die Kriterien der Open Source Definition, die weit über die Verfügbarkeit des Quelltexts hinausgeht und fast deckungsgleich mit sog. Freier Software ist, d. h. der Quelltext muss auch offen für Bearbeitung und Weiterverbreitung sein... (mehr dazu auf Wikipedia) verwendet. Insbesondere die Tools:

Während im kommerziellen Umfeld Tools wie Antenna House eingesetzt werden, sind meiner Ansicht nach für einfachere Anwendungen, wie z.b. eine Diplomarbeit zu formatieren diese Tools vollkommen ausreichend. Gerne könnt ihr dieses Skript hier für solche Sachen verwenden.

Eigentlich ist das ganze ziemlich abgefahren, denn normalerweise werden die Formate HTML und PDF aus einer XML Quelle generiert. Hier ist es ein bischen anders. Ein ganz einfaches HTML Dokument dient als Eingabe und das Programm generiert daraus über ein XML Zwischenformat das PDF Dokument. Das HTML Dokument kann per Hand oder mittels eines Editors (Ich verwende Dreamweaver 4) erstellt werden. Nachdem Saxon ein wohlgeformtes XML Dokument als Eingabe erwartet, aber gängige Editoren das selten erzeugen können, verwende ich noch HTML Tidy HTML Tidy ist ein Computerprogramm, das dabei hilft, ungültige HTML-Tags zu erkennen und diese Fehler durch Entfernen bzw. Einfügen der fehlenden Tags zu beheben. (mehr dazu auf Wikipedia) um den HTML Code aufzuräumen - bevor er an Saxon übergeben wird.

Schema des dreistufigen Transformationsprozess

Formatierungsmöglichkeiten

Die folgenden HTML Tags werden verarbeitet:

Das ganze ist mit Absicht so spartanisch gehalten, weil man dadurch das Dokument mit ganz einfachen Tools editieren kann, z.B. mit Notepad auf einem PDA oder mit dem Handy... Durch den Einsatz von HTML Tidy kann aber auch ein herkömmlicher Webeditor verwendet werden.

Coverseite - <h1> Elemente

Die Überschriften Heading 1 <h1> werden für die Texte auf der Coverseite verwendet:

die Coverseite wird bedatet durch die ersten 7 Überschriften <h1>

Textelemente

Ungeordnete Listen - <ul> Element

Diese werden bis zu zwei Ebenen unterstützt, z.B.:

Die HTML Eingabe würde für die Liste oben so aussehen:

<ul>
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3 mit Unterliste<br />
    <ul>
      <li>item 1 der Unterlste</li>
      <li>item 2 der Unterliste</li>
      <li>item 3 der Unterliste</li>
      <li>item 4 der Unterliste</li>
      <li>item 5 der Unterliste</li>
      <li>item 6 der Unterliste</li>
    </ul>
  </li>
</ul>

HTML Quellcode für eine Liste

Hinweise - <b> Element

Hinweise werden mit dem <b> Element gekennzeichnet - der folgende Absatz erscheint im PDF mit Hinweis Symbol und grau hinterlegt:

bla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla bla

Fussnoten - <i> Element

Fussnoten werden mit dem <i> Tag gekennzeichnet. Das ist ein kleiner Missbrauch, denn <i> steht für italic und formatiert den Text normalerweise kursiv. Fussnoten funktionieren nur im normalen Fliesstext. Sie werden im Literaturverzeichnis nochmal aufgeführt, hier ist ein Absatz mit Fussnoten:

bla blaaa bla blabla blabla bla bla wird gerne als Fülltext genommen blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla blabla blaaa bla blabla zuviel bla bla stört aber lorem ipsum doloris lorem ipsum doloris lorem ipsum doloris lorem ipsum doloris da ist lorem ipsum schon besser

Tabellen - <table> Element

Tabellen werden mit dem <table> Tag gekennzeichnet. Die PDF Transformation unterstützt einfache HTML Tabellen, einerseits zum Anordnen von Grafiken und Text für Layoutzwecke und anderseits im herkömmlichen Sinn.

Ohne die Angabe des border Attributes, bzw. mit einem Wert für das border Attribut von 0 erscheint die Tabelle ohne Rahmen und Hintergrund. Auf diese Art und Weise kann man Bilder anordnen, etc.

zelle 1 zelle 2 zelle 3 zelle 4

zelle mit liste:

  • item 1
  • item 2
  • item 3 mit Unterliste
    • item 1 der Unterlste
    • item 2 der Unterliste
bla bla
bla bla bla bla

 Hier ist der HTML Quellcode dazu:

<table border="0">
  <tbody>
  <tr>
    <td>zelle 1</td>
    <td>zelle 2</td>
    <td>zelle 3</td>
    <td>zelle 4</td>
  </tr>
  <tr>
    <td>
      <p>zelle mit liste:</p>
      <ul>
        <li>item 1</li>
        <li>item 2</li>
        <li>item 3 mit Unterliste<br />
          <ul>                                                 
            <li>item 1 der Unterlste</li>
            <li>item 2 der Unterliste</li>
          </ul>
        </li>
      </ul>
    </td>
    <td>
      <img src="images/no8.gif" alt=""/>
    </td>
    <td>bla</td>
    <td>bla</td>
  </tr>
  <tr>
    <td>bla</td>
    <td>bla</td>
    <td>bla</td>
    <td>bla</td>
  </tr>
  </tbody>
</table>

HTML Quellcode für die Formatierung einer Tabelle ohne Rahmen

Wenn die Tabelle mit Hintergrund und Rahmen im PDF erscheinen soll, dann muss man das border Attribut mit mindestens 1 setzen, hier dieselbe Tabelle zum Vergleich:

zelle 1 zelle 2 zelle zelle 4

zelle mit liste:

  • item 1
  • item 2
  • item 3 mit Unterliste
    • item 1 der Unterlste
    • item 2 der Unterliste
bla bla
bla bla bla bla

Gegenüberstellung von Werten

Der Untertitel der Tabelle, hier "Gegenüberstellung von Werten" wird durch das unmittelbar nach der Tabelle folgende <p> Tag angegeben.

Vorformatierter Text - <pre> Element

mit dem <pre> Element kann man Quelltext formatieren, so wie diesen hier:

<pre>
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
</pre>
<p>Hello World Programm<p>

Hello World Programm

Der Absatz <p> der unmittelbar nach dem <pre> Element kommt, wird vom PDF Stylesheet als Titel interpretiert

Bilder - <img> Element

Bilder werden mit dem <img> Tag eingebunden. Übrigens sind die kleinen icons von der Website simplebits.com. Ich habe eine Lizenz für sie erworben. Diese dürfen nicht weiterverwertet werden.

Ein Diskette Icon - die Dinger gibt es schon nicht mehr...

Screenshot vom Handy-Mandarin-Trainer

Ein Absatz der dem Bild folgt wird als Untertitel interpretert - das gilt nicht für Bilder in Tabellen.

Grafiken werden am besten im Verzeichnis 'images' abgelegt. Das Logo und die icon Grafiken von book.pdf befinden sich im Ordner 'stylesheet/styleimages'.

Links - <a> Element

Hyperlinks wie dieser hier zu meiner Homepage, erscheinen im PDF wie im HTML gleich...

Kapitelstruktur - <h2>,<h3>,<h4>,<h5>

Die Kapitelstruktur wird aus den Überschriften generiert. Dabei werden die Überschriften automatisch nummeriert! Es werden nur die Überschriften Heading 2 <h2> bis Heading 5 <h5> verarbeitet.

Ein bischen muss man dabei aufpassen:

Auf eine Überschrift Heading 2 <h2> muss eine Überschrift heading 3 <h3> folgen, auf <h3> kann <h4> oder <h2> folgen, auf <h4> kann <h4>, <h3> oder <h2> folgen, usw. Ausserdem sollte das Dokument mit einer Überschrift Heading <h2> beginnen... (nach den <h1> für die Coverseite). ACHTUNG: Das Programm kann kein PDF erzeugen, wenn man sich hier vertut!

Lizenz für das Stylesheet html2pdf.xsl

THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.