2010-07-16 4 views
1

J'utilise xhtmlrenderer (également connu sous le nom Flying Saucer) avec iText pour convertir du HTML en PDF. Comment créer des signets avec ceci? Est-ce que quelqu'un avec un petit exemple?Marque-pages avec xhtmlrenderer (iText)

Merci d'avance.

Répondre

4

Il semble que des signets ont été ajoutés dans R6, mais le guide de l'utilisateur ne leur donne qu'une référence. avec un TODO à l'auteur pour ajouter un exemple plus tard.

Recherche dans les forums, j'ai trouvé this example:

<html> 
<head> 
<bookmarks> 
    <bookmark name="A bookmark" href="#bm" /> 
    <bookmark name="A bookmark 2" href="#bm2" /> 
    <bookmark name="A bookmark 3" href="#bm3" />  
    <bookmark name="A bookmark 4" href="#bm4" /> 
    <bookmark name="A bookmark invalid" href="#bm99" /> 
</bookmarks> 
</head> 
<body> 
    <div style="line-height: 100%; font-size: 12pt; page-break-before: always;"> 
     <a name="bm">some text</a> 
    </div> 
    <div style="line-height: 100%; font-size: 12pt; page-break-before: always;"> 
     <a name="bm2">some text</a> 
    </div> 
    <div style="line-height: 100%; font-size: 12pt; page-break-before: always;"> 
    <a name="bm3">some text</a> 
    </div> 
    <div style="line-height: 100%; font-size: 12pt; page-break-before: always;"> 
     <p>some text</p> <p>some text</p> <p>some text</p> <p>some text</p> <p>some text</p> <p>some text</p> 
     <p><a name="bm4">and some more text</a></p> 
    </div> 
</body> 
</html>` 

Il semble donc que l'ajout de signets est plus que de déclarer les signets dans le <head> et les référencer comme points d'ancrage dans le <body>.

Cela devrait fonctionner avec votre conversion XHTML-> PDF existante sans nécessiter de modifications de code.

+0

Merci, mais je ne veux pas un en-tête ou le pied de page sur la première page et que vous souhaitez qu'il commence à compter de la deuxième page . Comment pourrais-je modifier votre exemple pour le faire? Merci. – usertest

+0

Désolé, je ne comprends pas. Pouvez-vous me dire comment l'en-tête/pied de page est connecté avec les signets? – mdma

+0

Salut, ignorer cette dernière question, je l'ai eu le travail merci. – usertest

1

Il est correct que l'approche ci-dessus fonctionne.

exemple échantillon de flyingsaucer-R8-src modifié pour BookMarks démonstration

public class PDFRenderToMultiplePages { 
    public static void main(String[] args) throws Exception { 
     OutputStream os = null; 
     try { 
      final String[] inputs = new String[] { newPageHtml(1, "red"), 
        newPageHtml(2, "blue"), newPageHtml(3, "green") }; 
      final File outputFile = File.createTempFile("FlyingSacuer", ".pdf"); 
      os = new FileOutputStream(outputFile); 
      ITextRenderer renderer = new ITextRenderer(); 
      renderer.setDocumentFromString(inputs[0]); 
      renderer.layout(); 
      renderer.createPDF(os, false); 
      BlockBox rootBox = renderer.getRootBox(); 
      for (int i = 1; i < inputs.length; i++) { 
       renderer.setDocumentFromString(inputs[i]); 
       renderer.layout(); 
       renderer.writeNextDocument(); 
      } 
      renderer.finishPDF(); 
      System.out.println("Sample file with " + inputs.length 
        + " documents rendered as PDF to " + outputFile); 
     } finally { 
      if (os != null) { 
       try { 
        os.close(); 
       } catch (IOException e) { /* ignore */ 
       } 
      } 
     } 
    } 

    private static String newPageHtml(int pageNo, String color) { 
     return "<html><head><bookmarks>" 
       + "<bookmark name=\"bookmark" 
       + pageNo 
       + "\" href=\"#bookMark\"/></bookmarks></head>" 
       + "<body><div style=\"color:" 
       + color 
       + "" 
       + ";\"><a name=\"bookMark\">Book Mark Example</a></div></body></html>"; 
    } 
} 
+0

Salut, quelque chose ne va pas avec les marques thebook, l'exemple ci-dessus produit - bookmark1, bookmark1, bookmark2, bookmark1, bookmark2, bookmark3 - au lieu de seulement trois signets. Est-ce quelque chose à voir avec la boucle for? Merci. – usertest