
Gérer l'affichage en colonnes des PDF avec iText
iText est une librairie Java permettant de générer des documents PDF : http://itextpdf.com/.
Nous allons voir comment gérer l’affichage par colonne avec la classe MultiColumnText : http://api.itextpdf.com/com/itextpdf/text/pdf/MultiColumnText.html.
Pour cela, nous afficherons un long texte (Lorem ipsum dolor sit amet…) sur 3 colonnes par page.
Préparation
La version de la librairie iText utilisée est 5.0.2. Vous pourrez la télécharger sur le site officiel : http://itextpdf.com/.
Le texte que nous utiliserons a été généré à partir du site http://www.lipsum.com/ (9 paragraphes).
Ce texte est enregistré dans le fichier C:/lipsum.txt.
Création de la classe Java
Pour réaliser notre test, nous créons une classe Java appelée Columns.
package fr.benjaminprevot.itext;
/**
* @author Benjamin PREVOT
*/
public class Columns {
private String pathname;
private String filename;
/**
* Constructeur
*/
public Columns(String pathname, String filename) {
this.pathname = pathname;
this.filename = filename;
}
}
Cette classe contient 2 attributs :
pathname
: chemin vers le fichier contenant le texte à afficher (C:/lipsum.txt dans notre cas)filename
: chemin vers le fichier PDF à générer
Pour l’instant, notre classe ne contient que ses attributs et un constructeur.
Nous allons tout d’abord lui ajouter une fonction permettant de charger les paragraphes à partir d’un fichier.
Chargement du texte
Une méthode sera dédiée à la lecture du texte à afficher.
Elle retournera une liste de chaînes de caractères qui représenteront les paragraphes.
/**
* Charge le texte à afficher à partir d'un fichier.
*
* @param pathname Chemin complet vers le fichier
* @return Une liste de paragraphes à afficher
* @throws FileNotFoundException Si le fichier n'existe pas
* @throws IOException Si une exception I/O est générée
*/
public List<String> getText(String pathname) throws FileNotFoundException, IOException {
// Fichier contenant le texte
File file = new File(pathname);
// Reader pour lire le contenu du fichier
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
// Initialisation de la liste
List<String> list = new ArrayList<String>();
// Lecture du fichier
while (reader.ready()) {
list.add(reader.readLine());
}
// Retour du contenu
return list;
} finally {
// Fermeture du reader
if (reader != null) {
reader.close();
}
}
}
Nous passerons rapidement sur cette fonction qui n’est pas très compliquée (lecture du fichier, enregistrement des lignes dans une liste, retour de la liste).
Génération du PDF
Pour finir, nous créerons une méthode qui va générer le fichier PDF contenant le texte lu à partir du fichier.
La présentation se fera sous forme de 3 colonnes par page.
/**
* Création du fichier PDF.
* @throws DocumentException Si une exception est générée dans le Document
* @throws FileNotFoundException Si le fichier n'est pas trouvé
* @throws IOException Si une exception I/O est générée
*/
public void generate() throws DocumentException, IOException {
// Fichier PDF
File file = new File(filename);
// Si le fichier existe déjà, il est supprimé
if (file.exists()) {
file.delete();
}
// Flux de sortie
OutputStream os = null;
// Création du document iText
Document document = null;
try {
os = new FileOutputStream(file);
document = new Document(PageSize.A4, 20, 20, 20, 20);
// Lien entre le document et le flux de sortie
PdfWriter.getInstance(document, os);
// Ouverture du docuement pour écriture
document.open();
// Création d'un object MultiColumnText permettant de gérer l'affichage par colonne
MultiColumnText mct = new MultiColumnText();
// Définition des colonnes : 3 colonnes espacées de 10 unités
mct.addRegularColumns(document.left(), document.right(), 10f, 3);
// Affichage des paragraphes
List<String> list = getText(pathname);
for (String s : list) {
mct.addElement(new Paragraph(s));
}
document.add(mct);
} finally {
if (document != null) {
// Fermeture du document et enregistrement dans le fichier columns.pdf
document.close();
}
if (os != null) {
// Fermeture du flux de sortie
os.close();
}
}
}
Nous ne attarderons pas sur la création du document PDF en lui-même.
Pour plus de détails, vous pouvez vous référer au site officiel : http://itextpdf.com/examples/index.php?page=chapters.
La partie qui nous intéresse pour l’affichage par colonne correspond à l’utilisation de la classe MultiColumnText.
Après l’instanciation (MultiColumnText mct = new MultiColumnText()
), nous définissons les propriétés de l’affichage en colonne (mct.addRegularColumns(document.left(), document.right(), 10f, 3)
).
Nous utilisons la méthode addRegularColumns qui permet une répartition régulière des colonnes.
- 1er paramètre : position à gauche
- 2ème paramètre : position à droite
- 3ème paramètre : espacement entre les colonnes
- 4ème paramètre : nombre de colonnes
Pour plus de détails sur cette méthode, vous pouvez vous référer à la documentation officielle : http://api.itextpdf.com/com/itextpdf/text/pdf/MultiColumnText.html#addRegularColumns(float, float, float, int).
Exécution du code
Notre classe est maintenant terminée, nous pouvons la tester.
public static void main(String[] args) throws Exception {
new Columns("C:/lipsum.txt", "C:/columns.pdf").generate();
}
Vous pourrez alors voir le résultat dans le fichier C:/columns.pdf. Le code complet de la classe, le contenu du fichier à afficher et le résultat sont ici : http://demo.benjaminprevot.fr/gerer-laffichage-en-colonnes-des-pdf-avec-itext/source.zip.