xhtmlrenderer: DOCTYPE

Wenn man mit dem xhtmlrenderer ein PDF erzeugen möchte sollte man in der Quell-XHTML-Datei die DOCTYPE Definition weglassen. Bleibt diese nämlich drin wird die parse() Methode des DocumentBuilder versuchen die DTD zu laden. Und wenn das nicht möglich ist (zum Beispiel, weil keine Netzwerkverbindung aufgebaut werden kann/darf) bleibt das Programm an dieser Stelle einfach (und zunächst ohne Fehler) stehen.

File inputFile   = new File( "input.xhtml" );
String baseUrl = inputFile.toURI().toURL().toString().replace( inputFileName, "");

DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = dBuilder.parse( inputFile );

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument( doc, baseUrl );
renderer.layout();

FileOutputStream pdfOutputStream = new FileOutputStream(outputFileName);

renderer.createPDF( pdfOutputStream );

pdfOutputStream.close();

xhtmlrenderer: PDFs mit Bookmarks / Inhaltsverzeichnis erstellen

Dass man mit dem xhtmlrenderer (The Flying Saucer Project) aus xhtml Dateien PDFs erzeugen kann ist weitläufig bekannt. Dass man über spezielle XML-Elemente zudem Lesezeichen (Bookmarks) im PDF erzeugen kann, weniger. Man kann sogar die <bookmark />-Tags verschachteln um so eine Hierarchie (wie zum Beispiel ein Inhaltsverzeichnis) abzubilden. Das Hauptelement <bookmarks> muss dabei im <head> platziert werden.

<html>
    <head>
        <bookmarks>
            <bookmark name="A bookmark" href="#bm" />
            <bookmark name="A bookmark 2" href="#bm2">
                <bookmark name="A bookmark 3" href="#bm3" />
            </bookmark>
            <bookmark name="A bookmark invalid" href="#bm99" />
        </bookmarks>
    </head>
    <body>
        <a name="bm1">Jumpmark 1</a>
        <a name="bm2">Jumpmark 2</a>
        <a name="bm3">Jumpmark 3</a>
    </body>
</html>

Im PDF sieht es dann so aus: