2016-04-11 132 views
4

我想将一些文本发送到打印机。我只需要打印文本,并将其包装在页边距上,并在必要时流向另一页。如何只打印文本?

这里是什么,我现在所做的一个小例子:

@FXML 
private void print() { 
    TextArea printArea = new TextArea(textArea.getText()); 
    printArea.setWrapText(true); 
    printArea.getChildrenUnmodifiable().forEach(node -> node.setStyle("-fx-background-color: transparent")); 
    printArea.setStyle("-fx-background-color: transparent"); 

    PrinterJob printerJob = PrinterJob.createPrinterJob(); 

    if (printerJob != null && printerJob.showPrintDialog(textArea.getScene().getWindow())) { 
     if (printerJob.printPage(printArea)) { 
      printerJob.endJob(); 
      // done printing 
     } else { 
      // failed to print 
     } 
    } else { 
     // failed to get printer job or failed to show print dialog 
    } 
} 

什么最终印刷是一个灰色的背景,这似乎是控件本身,与滚动条一起。我以错误的方式接近这个吗?我觉得我正在通过调整和打印控件来对抗API,而不是仅仅发送要打印的文本。

下面的示例图像是从我的手机相机拍摄的,所以白皮书最终看起来有点浅灰色,但仍然可以看到控件和滚动条的灰色背景。

example image of print result

回答

3

而是一个TextArea的,打印TextFlow

private void print() { 
    TextFlow printArea = new TextFlow(new Text(textArea.getText())); 

    PrinterJob printerJob = PrinterJob.createPrinterJob(); 

    if (printerJob != null && printerJob.showPrintDialog(textArea.getScene().getWindow())) { 
     PageLayout pageLayout = printerJob.getJobSettings().getPageLayout(); 
     printArea.setMaxWidth(pageLayout.getPrintableWidth()); 

     if (printerJob.printPage(printArea)) { 
      printerJob.endJob(); 
      // done printing 
     } else { 
      System.out.println("Failed to print"); 
     } 
    } else { 
     System.out.println("Canceled"); 
    } 
} 

注意,是TextFlow的maxWidth需要使用的PrinterJob的页面布局设置,已经显示出在打印对话框后。