web-dev-qa-db-fra.com

Java: Impression du programme sur une imprimante physique

Je suis un programmeur relativement nouveau, alors c’est peut-être une question très simple à laquelle répondre, mais cela m’a quelque peu troublé. 

J'essaie d'imprimer la sortie finale de mon interface graphique Java sur une imprimante. Maintenant, dans mon interface graphique, je le fais de sorte que lorsque vous appuyez sur imprimer, une fenêtre contextuelle s'affiche avec la liste des imprimantes disponibles et, en fonction de celle que vous avez sélectionnée, elle devrait être imprimée sur cette imprimante.

Cependant ce n'est pas. J'ai obtenu l'essentiel de mon code en parcourant Internet pour trouver des solutions à ce problème et en trouvant du code prometteur. Cependant, il est imprimé à partir d'un fichier. Donc, tout ce que je fais simplement dans ma méthode est d’écrire d’abord ma sortie dans un fichier pour pouvoir utiliser la même méthodologie. 

Quelques choses avant la méthode: 

  1. Il n'y a pas d'erreurs ni d'exceptions.

  2. Le fichier que je tente de créer à chaque fois existe toujours et avec le texte correct.

  3. L’imprimante sur laquelle je suis en train d’imprimer reçoit IS le travail d’impression, elle pense même l’avoir terminée.

Si je devais deviner, je penserais peut-être que je suis en train d'écrire la sortie dans un fichier d'une manière que l'imprimante ne va pas excepter, mais ne me dit pas. Quoi qu'il en soit, il y a pas mal de choses dans ce code que je ne comprends pas vraiment, alors faites-le-moi savoir ce que vous pouvez trouver.

Voici mon code: 

private void printToPrinter()
    {

        File output = new File("PrintFile.txt");
        output.setWritable(true);
        //Will become the user-selected printer.
        Object selection = null;
        try 
        {
            BufferedWriter out = new BufferedWriter(new FileWriter(output));
            out.write(calculationTextArea.getText() + "\n" + specificTextArea.getText());
            out.close();

        }
        catch (Java.io.IOException e)
        {
            System.out.println("Unable to write Output to disk, error occured in saveToFile() Method.");
        }
        FileInputStream textStream = null;
        try 
        {
            textStream = new FileInputStream("PrintFile.txt");
        }
        catch (Java.io.FileNotFoundException e)
        {
            System.out.println("Error trying to find the print file created in the printToPrinter() method");
        }

        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc mydoc = new SimpleDoc(textStream, flavor, null);

        //Look up available printers.
        PrintService[] printers = PrintServiceLookup.lookupPrintServices(flavor, null);

        if (printers.length == 0)
        {
            // No printers found. Inform user.
            jOptionPane2.showMessageDialog(this, "No printers could be found on your system!", "Error!", JOptionPane.ERROR_MESSAGE);
        }
        else
        {
            selection = jOptionPane2.showInputDialog(this, "Please select the desired printer:", "Print", 
                                                        JOptionPane.INFORMATION_MESSAGE, null, printers,
                                                        PrintServiceLookup.lookupDefaultPrintService()); 
            if (selection instanceof PrintService)
            {
                PrintService chosenPrinter = (PrintService) selection;
                DocPrintJob printJob = chosenPrinter.createPrintJob();
                try 
                {
                    printJob.print(mydoc, null);
                }
                catch (javax.print.PrintException e) 
                {
                    jOptionPane2.showMessageDialog(this, "Unknown error occured while attempting to print.", "Error!", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
}
9
Alex

J'ai donc trouvé un moyen qui convient parfaitement à ma situation et j'ai pensé poster ce que c'était au cas où cela serait utile à quiconque. 

Les bases de la solution sont que Java a son propre printDialog popUp qui a plus que ce dont j'avais besoin (édition de mise en page, prévisualisations, etc.) et tout ce que vous avez à faire pour l'utiliser est à portée de main. un objet qui implémente Printable et c’est dans cet objet que vous créez un graphique et dessinez votre document. 

J'avais juste besoin de dessiner ma chaîne de sortie et cela s'est fait facilement. J'ai même trouvé un StringReader afin de pouvoir arrêter naïvement d'écrire un fichier simplement pour que ma sortie apparaisse dans BufferedReader.

Voici le code. Il y a deux parties, la méthode et la classe où je dessine l'image:

Méthode: 

private void printToPrinter()
{
    String printData = CalculationTextArea.getText() + "\n" + SpecificTextArea.getText();
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(new OutputPrinter(printData));
    boolean doPrint = job.printDialog();
    if (doPrint)
    { 
        try 
        {
            job.print();
        }
        catch (PrinterException e)
        {
            // Print job did not complete.
        }
    }
}

Et voici la classe où le document est imprimé:

public class OutputPrinter implements Printable 
{
    private String printData;

    public OutputPrinter(String printDataIn)
    {
    this.printData = printDataIn;
    }

@Override
public int print(Graphics g, PageFormat pf, int page) throws PrinterException
{
    // Should only have one page, and page # is zero-based.
    if (page > 0)
    {
        return NO_SUCH_PAGE;
    }

    // Adding the "Imageable" to the x and y puts the margins on the page.
    // To make it safe for printing.
    Graphics2D g2d = (Graphics2D)g;
    int x = (int) pf.getImageableX();
    int y = (int) pf.getImageableY();        
    g2d.translate(x, y); 

    // Calculate the line height
    Font font = new Font("Serif", Font.PLAIN, 10);
    FontMetrics metrics = g.getFontMetrics(font);
    int lineHeight = metrics.getHeight();

    BufferedReader br = new BufferedReader(new StringReader(printData));

    // Draw the page:
    try
    {
        String line;
        // Just a safety net in case no margin was added.
        x += 50;
        y += 50;
        while ((line = br.readLine()) != null)
        {
            y += lineHeight;
            g2d.drawString(line, x, y);
        }
    }
    catch (IOException e)
    {
        // 
    }

    return PAGE_EXISTS;
}
}

Quoi qu'il en soit, c'est comme ça que j'ai résolu ce problème! J'espère que cela pourra être utile à quelqu'un!

9
Alex

Créez une JTextComponent (je suggère une JTextArea pour pouvoir utiliser append()) et ajoutez ce dont vous avez besoin au champ. Ne l'affichez pas dans la vue, il s'agit simplement d'un champ masqué pour l'impression.

Tous les JTextComponents ont une méthode print(). Appelez simplement hiddenTextArea.print() et le reste est traité pour vous.

        JTextArea hiddenTextArea = new JTextArea();
        for (String s : dataToPrintCollection) {
            hiddenTextArea.append(s + "\n");
        }

        try {
            hiddenTextArea.print();
        } catch (PrinterException e) {}
1
Ron

au lieu de générer un document, vous pouvez imprimer directement les graphiques d’un JFrame/JPanel. Ce code devrait fonctionner: 

PrinterJob pj = PrinterJob.getPrinterJob();
              pj.setJobName("name");

                PageFormat format = pj.getPageFormat(null);

                pj.setPrintable (new Printable() {

                @Override
                public int print(Graphics pg, PageFormat pf, int pageNum) throws PrinterException {
                    if (pageNum > 0){
                          return Printable.NO_SUCH_PAGE;
                          }

                          Graphics2D g2 = (Graphics2D) pg;

                          this.Paint(g2);
                          return Printable.PAGE_EXISTS;
                }

              }, format);
              if (pj.printDialog() == false)
              return;


              pj.print();
              } catch (PrinterException ex) {
                    // handle exception
              }
            }
0
Anthea