Imprimer avec Java
Imprimer avec JavaFX
Cette solution est conseillée pour une application avec une interface graphique JavaFX.
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class JavaFXPrint extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Label jobStatus = new Label("Status de l'impression : ");
TextArea textArea = new TextArea();
Button printButton = new Button("Imprimer");
// Creation d'un handler pour le bouton
printButton.setOnAction(new EventHandler < ActionEvent > () {
public void handle(ActionEvent event) {
// Creation du printer job
PrinterJob job = PrinterJob.createPrinterJob();
// Montre la boite de dialogue
boolean proceed = job.showPrintDialog(stage);
// Si l'utilisateur clique sur imprimer dans la boite de dialogue
if (proceed) {
job.jobStatusProperty().addListener((observable, oldValue, newValue) -> {
if (newValue == PrinterJob.JobStatus.PRINTING)
jobStatus.setText("Status de l'impression : Impression en cours...");
if (newValue == PrinterJob.JobStatus.DONE)
jobStatus.setText("Status de l'impression : Texte imprimé avec succès !");
if (newValue == PrinterJob.JobStatus.ERROR)
jobStatus.setText("Status de l'impression : Erreur lors de l'impression");
});
// Imprime la zone texte
boolean printed = job.printPage(textArea);
if (printed) {
job.endJob();
}
}
}
});
/* Mise en page */
VBox root = new VBox();
root.getChildren().addAll(textArea, printButton, jobStatus);
Scene scene = new Scene(root);
stage.setScene(scene);
/* Fin mise en page */
stage.show();
}
}
Impression basique
Cette solution est recommandée pour une application en ligne de commande.
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
public class BasicPrint {
public static void main(String[] args) throws PrintException, IOException {
// On donne la type MIME d'impression
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
// On peut prendre tous les services disponibles
//PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
PrintRequestAttributeSet pref = new HashPrintRequestAttributeSet();
// On peut ouvrir la boite de dialogue avec aucune préférences
//PrintService service = ServiceUI.printDialog(null, 200, 200, services, null, flavor, pref);
if (service == null) {
System.out.println("Impression annulée");
System.exit(0);
}
// La chaine Ă imprimer
InputStream is = new ByteArrayInputStream("Super texte".getBytes());
/* On crée un document et l'impression */
Doc doc = new SimpleDoc(is, flavor, null);
DocPrintJob job = service.createPrintJob();
// On ajoute un Job Listener pour savoir si le texte à été imprimé
PrintJobWatcher printJobWatcher = new PrintJobWatcher();
job.addPrintJobListener(printJobWatcher);
// impression
job.print(doc, pref);
/*
* processus bloquant... on attend que l'impression se termine
*/
printJobWatcher.waitForDone();
is.close();
}
}
class PrintJobWatcher implements PrintJobListener {
boolean done = false;
// processus bloquant
public synchronized void waitForDone() {
try {
// on attend tant que l'impression n'est pas terminée
while (!done)
wait();
} catch (InterruptedException e) {}
}
@Override
public void printDataTransferCompleted(PrintJobEvent arg0) {
System.out.println("Donnée transférée");
}
@Override
public void printJobCanceled(PrintJobEvent arg0) {
System.out.println("Impression annulée");
notifyDone();
}
@Override
public void printJobRequiresAttention(PrintJobEvent arg0) {
System.out.println("Erreur... (Pas de papier)");
}
@Override
public void printJobCompleted(PrintJobEvent evt) {
System.out.println("Texte imprimé avec succès");
notifyDone();
}
@Override
public void printJobNoMoreEvents(PrintJobEvent arg0) {
System.out.println("Texte imprimé avec succès (sans vérification)");
notifyDone();
}
@Override
public void printJobFailed(PrintJobEvent evt) {
System.out.println("Erreur lors de l'impression");
notifyDone();
}
void notifyDone() {
synchronized(this) {
done = true;
System.out.println("Impression terminée !");
this.notify();
}
}
}
Imprimer avec Java Swing
Cette méthode est recommandée pour une application avec une interface graphique Swing.
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class SwingPrint {
public static void main(String[] args) {
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridBagLayout());
/* Mise en page */
GridBagConstraints gbc = new GridBagConstraints();
// un seul élément par ligne
gbc.gridx = 0;
// aligne les éléments à gauche
gbc.anchor = GridBagConstraints.WEST;
/* Fin Mise en page */
JTextArea textArea = new JTextArea(10, 50);
JButton printButton = new JButton("Imprimer");
printButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
// impression
textArea.print();
} catch (PrinterException e) {
System.out.println("Erreur lors de l'impression");
}
}
});
mainFrame.add(textArea, gbc);
mainFrame.add(printButton, gbc);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.pack();
mainFrame.setVisible(true);
}
}
Imprimer en ligne de commande (méthode non conseillée)
Cette solution n'est pas recommandée puisqu'elle dépend du système d'exploitation. Il vaut mieux utiliser la méthode basique.
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class RuntimePrint {
public static void main(String[] args) throws IOException {
// enregistrement fichier Ă imprimer
File file = new File("fichier.txt");
if (file.createNewFile()) {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write("Texte Ă imprimer");
writer.close();
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("windows")) {
// exécute une commande avec ProcessBuilder pour imprimer sous windows : commande print ou notepad /p
} else if (os.contains("linux") || os.contains("mac")) {
// exécute une commande avec ProcessBuilder pour imprimer sous linux et mac : commande lpr
}
} else {
System.out.println("fichier.txt existe déjà !");
}
}
}
Commentaires
Enregistrer un commentaire