Un PDF depuis un ensemble HTML + ressources
Enregistrement de la page web concernée
Le manuel utilisateur se trouve à cette adresse.
Enregistrez là en tant que page web complète, dans le dossier racine de votre projet HtmlToPdf par exemple.
Ainsi, vous avez normalement un fichier HTML ainsi qu'un dossier de ressources.
Si votre classe HtmlToPdf n'est pas créée, créez là.
Un clic droit sur le projet devrait vous permettre de créer une nouvelle classe.
Dans cette classe, insérer ce code de base :
(si nécessaire, renommer les fichiers)
package htmltopdf;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyXmlSerializer;
import org.htmlcleaner.TagNode;
import java.io.*;
public class HtmlToPdf {
static String baseFolder = System.getProperty("user.dir") + "/"; // correspond à la racine du projet Java
static String entree = baseFolder+"UserGuide.html";
static String sortie = baseFolder+"UserGuide.pdf";
static String resourcesFolder = baseFolder+"\\UserGuide_fichiers\\";
static String cleanFile = baseFolder + "clean.xhtml";
public static void main(String[] args) throws Exception {
createPDF(entree, sortie);
}
public static void createPDF(String entree, String pdf) throws Exception {
OutputStream os = null;
try {
//
// Tout le travail reste à faire... Ensemble !
//
}
catch (IOException e) {
System.out.println(e.getMessage());
}
finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
package htmltopdf; import org.xhtmlrenderer.pdf.ITextRenderer; import org.htmlcleaner.CleanerProperties; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.PrettyXmlSerializer; import org.htmlcleaner.TagNode; import java.io.*; public class HtmlToPdf { static String baseFolder = System.getProperty("user.dir") + "/"; // correspond à la racine du projet Java static String entree = baseFolder+"UserGuide.html"; static String sortie = baseFolder+"UserGuide.pdf"; static String resourcesFolder = baseFolder+"\\UserGuide_fichiers\\"; static String cleanFile = baseFolder + "clean.xhtml"; public static void main(String[] args) throws Exception { createPDF(entree, sortie); } public static void createPDF(String entree, String pdf) throws Exception { OutputStream os = null; try { // // Tout le travail reste à faire... Ensemble ! // } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (os != null) { try { os.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } }
Nettoyage du fichier HTML
La première étape consiste à nettoyer le fichier HTML, à l'aide de l'API HtmlCleaner.
Nous produirons alors un fichier XHTML recevable par le moteur de Flying Saucer.
La méthode clean() de la classe org.htmlCleaner.HtmlCleaner nous renvoie un élément de type TagNode, qui correspond à une arborescence de noeuds XML. Cette arborescence est ensuite inscrite dans un fichier à l'aide d'un sérialiseur XML.
Les propriétés CleanerProperties fournies aux parseurs parlent d'elles-même.
CleanerProperties props = new CleanerProperties();
// paramètres d'analyse
props.setTranslateSpecialEntities(true);
props.setOmitComments(true);
// parse le fichier html
TagNode tagNode = new HtmlCleaner(props).clean(new File(entree));
// sérialise le contenu bien-formé dans le fichier clean
new PrettyXmlSerializer(props).writeToFile(tagNode, cleanFile, "utf-8");
CleanerProperties props = new CleanerProperties(); // paramètres d'analyse props.setTranslateSpecialEntities(true); props.setOmitComments(true); // parse le fichier html TagNode tagNode = new HtmlCleaner(props).clean(new File(entree)); // sérialise le contenu bien-formé dans le fichier clean new PrettyXmlSerializer(props).writeToFile(tagNode, cleanFile, "utf-8");
Création du Pdf
Il s'agit maintenant :
d'instancier notre flux de sortie (os)
de créer une classe d'export (renderer)
Notez qu'il s'agit d'une classe de la bibliothèque iText...
de fournir le contexte de notre fichier, c'est à dire ses ressources
de lui indiquer le document à traiter : renderer.setDocument()
d'effectuer le traitement : renderer.createPDF()
os = new FileOutputStream(pdf);
ITextRenderer renderer = new ITextRenderer();
// indique l'emplacement des ressources (images, css)
renderer.getSharedContext().getUserAgentCallback().setBaseURL(resourcesFolder);
// les 3 lignes classiques d'un rendu PDF avec Flying Saucer
renderer.setDocument(new File(cleanFile));
renderer.layout();
renderer.createPDF(os);
os.close();
os = null;
os = new FileOutputStream(pdf); ITextRenderer renderer = new ITextRenderer(); // indique l'emplacement des ressources (images, css) renderer.getSharedContext().getUserAgentCallback().setBaseURL(resourcesFolder); // les 3 lignes classiques d'un rendu PDF avec Flying Saucer renderer.setDocument(new File(cleanFile)); renderer.layout(); renderer.createPDF(os); os.close(); os = null;
Voici la classe finale, en une seule fois :
package htmltopdf;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyXmlSerializer;
import org.htmlcleaner.TagNode;
import java.io.*;
public class HtmlToPdf {
static String baseFolder = System.getProperty("user.dir") + "/"; // correspond à la racine du projet Java
static String entree = baseFolder+"UserGuide.html";
static String sortie = baseFolder+"UserGuide.pdf";
static String resourcesFolder = baseFolder+"\\UserGuide_fichiers\\";
static String cleanFile = baseFolder + "clean.xhtml";
public static void main(String[] args) throws Exception {
createPDF(entree, sortie);
}
public static void createPDF(String entree, String pdf) throws Exception {
OutputStream os = null;
try {
CleanerProperties props = new CleanerProperties();
//change les paramètres par defaut
props.setTranslateSpecialEntities(true);
props.setOmitComments(true);
// parse
TagNode tagNode = new HtmlCleaner(props).clean(new File(entree));
// sérialise le contenu bien-formé dans le fichier clean
new PrettyXmlSerializer(props).writeToFile(tagNode, cleanFile, "utf-8");
os = new FileOutputStream(pdf);
ITextRenderer renderer = new ITextRenderer();
// indique l'emplacement des ressources (images, css)
renderer.getSharedContext().getUserAgentCallback().setBaseURL(resourcesFolder);
// les 3 lignes classiques d'un rendu PDF avec Flying Saucer
renderer.setDocument(new File(cleanFile));
renderer.layout();
renderer.createPDF(os);
os.close();
os = null;
}
catch (IOException e) {
System.out.println(e.getMessage());
}
finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
package htmltopdf; import org.xhtmlrenderer.pdf.ITextRenderer; import org.htmlcleaner.CleanerProperties; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.PrettyXmlSerializer; import org.htmlcleaner.TagNode; import java.io.*; public class HtmlToPdf { static String baseFolder = System.getProperty("user.dir") + "/"; // correspond à la racine du projet Java static String entree = baseFolder+"UserGuide.html"; static String sortie = baseFolder+"UserGuide.pdf"; static String resourcesFolder = baseFolder+"\\UserGuide_fichiers\\"; static String cleanFile = baseFolder + "clean.xhtml"; public static void main(String[] args) throws Exception { createPDF(entree, sortie); } public static void createPDF(String entree, String pdf) throws Exception { OutputStream os = null; try { CleanerProperties props = new CleanerProperties(); //change les paramètres par defaut props.setTranslateSpecialEntities(true); props.setOmitComments(true); // parse TagNode tagNode = new HtmlCleaner(props).clean(new File(entree)); // sérialise le contenu bien-formé dans le fichier clean new PrettyXmlSerializer(props).writeToFile(tagNode, cleanFile, "utf-8"); os = new FileOutputStream(pdf); ITextRenderer renderer = new ITextRenderer(); // indique l'emplacement des ressources (images, css) renderer.getSharedContext().getUserAgentCallback().setBaseURL(resourcesFolder); // les 3 lignes classiques d'un rendu PDF avec Flying Saucer renderer.setDocument(new File(cleanFile)); renderer.layout(); renderer.createPDF(os); os.close(); os = null; } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (os != null) { try { os.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } }
Question
Ouvrez maintenant votre fichier Pdf généré, et comparez-le avec la version web. Quelles différences pouvez-vous noter ?
Quels éléments typiques d'un média paginé sont présents ?
Quels ajouts pourraient être encore appréciables ?