Java: печать вывода программы на физический принтер - PullRequest
9 голосов
/ 12 января 2012

Я относительно новый программист, так что это может быть очень простой вопрос, но он немного озадачил меня.

Я пытаюсь распечатать окончательный вывод моего Java GUI на принтер.Теперь в моем графическом интерфейсе у меня так, что когда вы нажимаете «Печать», появляется всплывающее окно со списком доступных принтеров, и на основе выбранного вами оно должно печататься на этом принтере.

Однако это не так.Я получил большую часть своего кода, отыскивая в Интернете решения этой проблемы, и нашел многообещающий код.Тем не менее, он распечатал файл.Таким образом, все, что я просто делаю в своем методе, это сначала записываю свои выходные данные в файл, чтобы я мог использовать ту же методологию.

Несколько вещей перед методом:

  1. Нет ошибок или исключений.

  2. Файл, который я пытаюсь выполнитьcreate каждый раз всегда существует и имеет правильный текст.

  3. Принтер, который я печатаю в IS, получает задание на печать, он даже думает, что выполнил его.

Если бы мне пришлось угадывать, я бы подумал, что, возможно, я записываю вывод в файл так, как принтер ничего не скажет, но не скажет мне.В любом случае, в этом коде есть немного информации, которую я не совсем понимаю, поэтому, пожалуйста, дайте мне знать, что вы можете найти.

Вот мой код:

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);
                }
            }
        }
}

Ответы [ 3 ]

9 голосов
/ 13 января 2012

Итак, я нашел способ, который идеально подходит для моей ситуации, и я подумал, что просто опубликую то, что было, на тот случай, если он будет полезен для всех.

Основой решения является то, что Java имеет свой собственный полноценный (по крайней мере, по сравнению с моим) всплывающий элемент printDialog, который имеет больше, чем мне нужно (редактирование макета страницы, предварительный просмотр и т. Д.), И все, что вам нужно сделать, чтобы использовать его hand это объект, который реализует Printable, и именно в этом объекте вы создаете графику и рисуете свой документ.

Мне просто нужно было нарисовать мой выходной String, и это было легко сделать, я даже нашел StringReader, чтобы я мог прекратить наивно писать файл, просто чтобы получить мой вывод в BufferedReader.

Вот код. Есть две части, метод и класс, где я рисую изображение:

Метод:

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

А вот класс, в котором напечатан документ:

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;
}
}

В любом случае, так я решил эту проблему! Надеюсь, это кому-нибудь пригодится!

1 голос
/ 10 января 2014

Создайте JTextComponent (я предлагаю JTextArea, чтобы вы могли использовать append()), и добавьте то, что вам нужно в поле.Не отображайте его на виде, это просто скрытое поле для печати. ​​

Все JTextComponent имеют метод print().Просто позвоните hiddenTextArea.print(), а все остальное будет обработано за вас.

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

        try {
            hiddenTextArea.print();
        } catch (PrinterException e) {}
0 голосов
/ 12 января 2012

вместо создания документа вы можете распечатать графику JFrame / JPanel напрямуюЭтот код должен работать:

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
              }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...