Gérer l'affichage en colonnes des PDF avec iText

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.