Recherche sur le blog

mardi 26 mai 2015

[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.


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.


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 sortie de la boucle.


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.

jeudi 21 mai 2015

[Java] Bibliothèque pour manipuler des PDF

Pour une raison ou pour une autre vous pouvez être amenés à manipuler des PDF par programmation. De nombreux SDK sont proposés, notamment par Adobe ou même Foxit, mais ceux-ci sont plutôt couteux. Cependant il existe une alternative open-source, peut-être moins complète mais qui dépanne pourtant bien, et celle-ci est proposée par Apache. Il s'agit de la bibliothèque PDFBox.

En résumé elle permet de créer des documents PDF ou de les modifier, d'extraire le contenu de ceux-ci, de les imprimer ou bien-même de les exporter vers des fichiers image. Le projet est également disponible sous forme d'une application qui propose de nombreuses lignes de commandes, utile si ce qu'on cherche à faire reste plutôt basique (exemple : lancer l'impression d'un document sur un périphérique spécifié).

Exemple d'utilisation pour une impression (avec "pdfbox-app-1.8.9.jar", en ligne de commande) : 

java -jar "pdfbox-app-1.8.9.jar" PrintPDF -printerName "NOM_IMP" -silentPrint "NOM_FIC"

- PrintPDF : nom de la classe qui contient la fonction main().
- printerName : permet de spécifier le nom de l'imprimante cible.
- silentPrint : permet de ne pas afficher la fenêtre de sélection.

Rendez-vous sur la page officielle où vous retrouverez tous les téléchargements, ainsi qu'une documentation complète de l'API. La Javadoc complète de la dernière version (1.8.9) se trouve ici. Bon développement à toutes et à tous !

mardi 19 mai 2015

[Système] Changer Mot de passe expiré via OWA

Si vous avez mis en place une politique d'expiration des mots de passe dans votre domaine, vous pouvez éventuellement activer la possibilité de modifier le mot de passe par l'intermédiaire d'Outlook Web Access (OWA). Cette fonctionnalité peut être activée sur Exchange Server 2007 Service Pack 3 ou Exchange 2010 Service Pack 1. 

Connectez-vous au serveur sur lequel IIS et OWA sont installés. Si plusieurs serveurs sont concernés, les manipulations devront être répétées sur chacun d'entre eux. Voici ce qu'il faut faire :
  • Lancez l'éditeur de base de registre (démarrer, exécuter, "regedit.exe").
  • Naviguez jusqu'à la clé : HKLM\SYSTEM\CurrentControlSet\Services\MSExchange OWA.
  • Sélectionnez la clé puis dans le panneau de droite, effectuez un clic droit et créez une nouvelle valeur de type DWORD (32 bits).
  • Nom de la valeur = ChangeExpiredPasswordEnabled.
  • Indiquez (1) pour permettre aux utilisateurs de changer leur mot de passe s'il a expiré, ou (0) pour désactiver le mécanisme. Cela fonctionnera aussi si le paramètre "L'utilisateur doit changer de mot de passe" est coché dans l'Active Directory.
  • Fermez la base de registre.
  • Redémarrez les services IIS depuis une invite de commandes : IISReset /noforce (note : si le service ne s'arrête pas, enlevez le commutateur).
  • Vous devriez alors voir apparaitre la page suivante lorsque vous essayez de vous connectez alors que votre mot de passe a expiré ; notez qu'il est obligatoire de saisir à nouveau le nom d'utilisateur sous forme "Domaine\Utilisateur".
Sources