Imprimer simplement en Java

Les internautes impriment la page qu'ils consultent en cas de besoin. Pour les applications Java, c'est plus complexe. Il faut passer par des outils dédiés ou par Java2D.

Si les contraintes d'impression ne sont pas trop fortes, il est possible de générer un document et de passer par le navigateur pour l'imprimer. CSS permet d'obtenir une excellente présentation, mais il n'est pas encore possible de gérer les sauts ni les entêtes et pieds de pages.
Le code fonctionne sous Windows et repose sur une DLL qui est donnée sur divers forums comme permettant d'afficher un document en lançant le navigateur par défaut. En fait, cette DLL extrèmement puissante lance l'application gérant n'importe quel type de fichier rattaché à une application Windows. Pour un fichier RTF, l'application lancera le plus souvent Word.
Sous unix, le code du lancement du navigateur est variable. Des exemples sont disponibles dans les forums si le navigateur est Netscape.

Voici le code, qui n'appelle pas beaucoup de commentaires :

import java.io.*;
import java.net.*;

public class TestNav {
  public final static String NAV = "rundll32 url.dll,FileProtocolHandler";

  public static void main(String[] args) {
    try {
      File tmpFile = File.createTempFile("Test", ".html");
      String filePath = tmpFile.getCanonicalPath();
      FileOutputStream fos = new FileOutputStream(tmpFile);
      PrintStream  doc = new PrintStream(fos);
      doc.println("<HTML><head><title>Coucou print</title></head>");
      doc.println("<body>");
      doc.println("<h1>Une petit test d'impression</h1>");
      doc.println("Imprimer depuis un programme Java sans trop se fatiguer.");
      doc.println("<p>Le fichier généré est <code>"+filePath+"</code>.");
      doc.println("</body></Html>");
      doc.flush(); doc.close();
      fos.close();

      Runtime run = Runtime.getRuntime();
      run.exec(NAV + " " + filePath);
      run.wait(5000); // Time to run navigator before removing file.
      tmpFile.deleteOnExit();
    } catch (Exception e) {
       e.printStackTrace();
    }
  }
}
Pour faire simple, vous avez intérêt à tout coder dans une classe qui constitue le document et réalise l'impression. Quelques méthodes assez basiques de génération des principaux tags avec et sans paramètres simplifient l'utilisation. Une petite demi journée suffit à coder un ensemble assez propre.

Pour les cas plus complexes, se pencher sur les classes Swing dédiées à HTML.

Lancer tout type d'application sous Windows

Si vous avez déjà essayé avec plus ou moins de succès de lancer proprement des applications comme Excel, Internet Explorer, Paint Shop ou tout autre sous Windows, je vous propose la solution miracle. Depuis la console DOS, essayez


rundll32 url.dll,FileProtocolHandler c:\monfichier.test

avec un vrai nom de fichier ou un url.

C'est confondant de simplicité et ça marche dans tous les cas.
Il ne serait pas étonnant que Windows utilise cette dll quand quelque chose est à lancer.

J'ai essayé de creuser le sujet pour trouver comment lancer l'équivalent de l'option "imprimer" du clic droit, sans succès. Si vous trouvez, je suis preneur.

Avec Java, il y a juste un petit problème si vous utilisez un protocole file avec un objet URL. La systaxe est de type file:///c:\mondoc.txt, et l'objet URL ne gère pas correctement les 3 slash.

J'ai utilisé la notation


rundll32 url.dll,FileProtocolHandler url.getProtocol()+'://'+url.getFile();

Patrick Larreya, Juillet - Octobre 2000