如何只打印文本?

Cyp*_*her 4 java printing javafx

我正在尝试向打印机发送一些文本。我只需要打印文本,在页边距处包裹并在必要时流到另一页。

这是我现在正在做的一个最小的例子:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

最终打印的是灰色背景,它似乎是控件本身以及滚动条。我是否以错误的方式接近这个?我觉得我正在通过调整和打印控件而不是仅仅发送要打印的文本来与 API 作斗争。

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

打印结果的示例图像

VGR*_*VGR 5

而不是 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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