{Benjamin PREVOT}

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

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.

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 = 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;
}

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, FileNotFoundException, 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 = new FileOutputStream(file);
 
	// Création du document iText
	Document 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);
 
	// Fermeture du document et enregistrement dans le fichier columns.pdf
	document.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 {
	Columns columns = new Columns("C:/lipsum.txt", "C:/columns.pdf");
	columns.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.

  • STC
    2 avril 2011 à 20h18

    Salut j’ai un problème, mes colonnes s’affichent l’une en dessous de l’autre

  • 2 avril 2011 à 21h23

    Bonsoir,

    Il va me falloir plus d’informations pour pouvoir vous répondre;)
    Vous avez utilisé exactement le code de l’article ? Ou il s’agit d’un code que vous avez adapté ?

Les avatars utilisés proviennent du site Gravatar. Pour créer un compte, vous pouvez vous inscrire.
* Champs obligatoires