[Java] Charger et imprimer un PDF

Comme nous l’avons vu ci-dessous, il est possible de charger et d’imprimer un document PDF grâce à la librairie PDFBox fournie par Apache. Pour rappel elle également de créer et manipuler des documents dans ce format ainsi que d’en extraire du contenu voire exporter au format image. Nous allons voir comment imprimer un ensemble de documents dont on a stocké l’emplacement dans un fichier texte.

Pour assurer le bon fonctionnement de votre application, il faudra télécharger et intégrer le package Commons Logging (actuellement en version 1.2), ainsi que les fichiers Fontbox et Jempbox si vous manipulez les polices ou si vous avez besoin du support de XMP – eXtensible Metadata Platform – (même numéro de version que l’archive PDFBox). Pour plus d’informations vous pouvez consultez la page en suivant ce lien.

Traitement des options

Notre application pourra être appelée en spécifiant deux options. La première, optionnelle, permettra de donner le nom de l’imprimante à utiliser, et la seconde constituera le nom du fichier texte qui contient tous les emplacements des PDF à imprimer, séparés par des lignes.

for (int i = 0; i < args.length; i++)
{ 
	if (args[i].equals(PRINTER_NAME)) 
	{ 
		if (i >= args.length) 
		{ 
			usage();
		} 
		
		printerName = args[i]; 
	}
	else
	{ 
		loadFile = args[i]; 
	} 
} 

if (loadFile == null)
{ 
	usage(); 
}

Dans la fonction main() on réalise une boucle simple qui analyse l’ensemble des options (arguments), qui sont en fait stockées dans le tableau de chaines « args » qui est l’unique paramètre de notre fonction principale. On s’arrête lorsqu’on a atteint la longueur maximale de ce tableau. On regarde si l’option vaut le contenu de la variable « PRINTER_NAME » (déclarée en static pour indiquer qu’elle ne fait pas partie d’une instance particulière, et final pour faire en sorte que sa valeur ne soit jamais modifiée). On l’a initialisée avec la valeur « -printerName« .

Si l’option analysée correspond bien au contenu de la fameuse variable alors il faut récupérer le paramètre qui suit. Si aucun ne suit alors on appelle la fonction usage(). En fin de boucle on regarde également si le nom du fichier texte a bien été spécifié. Si ce n’est pas le cas il faut de nouveau appeler la méthode statique usage(). Cette dernière affiche un message dans la console puis arrête l’application.

prnJob = PrinterJob.getPrinterJob();
if (printerName != null)
{
   PrintService[] prnSvc = PrinterJob.lookupPrintServices();
   boolean prnFound = false;
   for (int i = 0; !prnFound && i < prnSvc.length; i++)
   {
      if (prnSvc[i].getName().indexOf(printerName) != -1)
      {
          prnJob.setPrintService(prnService[i]);
          prnFound = true;
      }
   }
}

Déterminer l’imprimante cible

Ensuite, il faut instancier un objet de la classe PrinterJob en appelant la fonction getPrinterJob(). L’objet est alors lié à l’imprimante définie par défaut sur la machine. Attention que si aucune imprimante n’est installée alors getPrintService() renverra null, et appeler la fonction print() générera une exception. Dans notre cas on utilise la fonction lookupPrintServices() pour instancier le tableau, uniquement si un nom d’imprimante a été spécifié dans les arguments. Attention, n’oubliez pas de vérifier que le tableau n’est pas vide !

Le tableau contient donc la liste de toutes les imprimantes installées. On va donc le parcourir pour voir si l’une d’entre elle correspond au nom recherché. Le nom d’une imprimante est récupéré avec la fonction getName() de l’objet PrintService. On utilise la fonction indexOf(chaine_cherchée) pour réaliser la comparaison. Si le périphérique en question a été trouvé (printerFound == true) ou si la fin du tableau est atteinte, on peut sortir de la boucle.

try (BuffereReader br = new BufferedReader( 
	new FileReader(loadFile))) 
{ 
	line = br.readLine; 
	while (line != null) 
	{ 
		pdfFile = line; 
		File f = new File(pdfFile); 
		if (f.exists() && !f.isDirectory()) 
		{ 
			try (PDDocument doc = PDDocument.load(pdfFile)) 
			{ 
				doc.silentPrint(prnJob); 
			} 
		} 
		
		line = br.readLine(); 
	} 
}

Imprimer les documents

La dernière étape consiste à ouvrir le fichier texte et à le parcourir. On instancie donc un objet de type BufferedReader pour lire le fichier texte. Pour lire chacune des lignes, il existe la fonction readLine(). On réalise une boucle tant que la ligne lue est différente de la valeur null. Chaque ligne représente donc un emplacement de fichier PDF. On va vérifier qu’il ne s’agit pas d’un dossier et que le fichier existe (création d’un objet de File).

Si c’est le cas, on va instancier un objet PDDocument en appelant la fonction load() de la classe, qui reçoit en paramètre le nom du fichier PDF à charger. Ensuite, on appelle la fonction silentPrint() en passant en paramètre l’objet PrinterJob précédemment créé. Vous remarquerez qu’on utilise la nouvelle syntaxe de l’instruction « try » qui permet la fermeture automatique pour chaque élément ouvert (syntaxe apparue depuis la sortie de Java 7).

Une fois l’impression effectuée, on lit la ligne suivante dans notre fichier texte pour récupérer le prochain document PDF à imprimer. Pour rappel, la boucle s’arrête lorsque la fonction readLine() renvoie la valeur null.

Et après?

Imprimer des PDF par programmation est donc possible grâce à PDFBox. Mais cela peut aller plus loin puisqu’il est possible de réaliser des extractions ou de créer un nouveau document. N’hésitez pas à tester les autres fonctionnalités et à partager vos ressources. Notez que cet exemple a été adapté à partir de la source en version 1.1.0 qui est disponible sur le site DocJAR.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *