打印文本时如何处理分页?

时间:2016-04-11 21:49:47

标签: java javafx printing javafx-8

我正在尝试将一些可能很长的文本发送到打印机......好吧,打印。这是一个最小的例子,演示了我当前如何打印文本:

@FXML
private void print() {
    Text printText = new Text(textArea.getText());
    TextFlow printArea = new TextFlow(printText);
    printArea.setTextAlignment(TextAlignment.LEFT);
    printArea.setMaxHeight(Region.USE_COMPUTED_SIZE);

    PrinterJob printerJob = PrinterJob.createPrinterJob();

    if (printerJob != null && printerJob.showPrintDialog(textArea.getScene().getWindow())) {

        PageLayout pageLayout = printerJob.getJobSettings().getPageLayout();
        printArea.setMaxWidth(pageLayout.getPrintableWidth());

        if (printerJob.printPage(pageLayout, printArea)) {
            printerJob.endJob();
            // done printing
        } else {
            System.err.println("Printing failed!");
        }

    } else {
        System.err.println("Unable to create printer job or printer dialog cancelled by user");
    }
}

上面的代码按预期打印文本,但无论打印多少文本,它总是只打印一页。在显示的打印对话框中,在"打印范围"部分下,我一直在选择"全部"选项。我试过选择" Pages"选项(出于某种原因从1到9999默认 - 这有点奇怪,因为文本最多应该有两页长),但是在打印多个页面时没有取得任何成功。我也尝试在JobSettings对象上手动设置页面范围,但这似乎也没有做任何事情。

enter image description here

如何使用PrinterJob及其相关类来获取一长段文本以在多个页面上正确打印?

1 个答案:

答案 0 :(得分:1)

据我所知,你需要在你的情况下提供多个节点printAreas到PrinterJob,事先在你的代码中将它们分开(不幸的是......)将TextFlow放在样式场景中会给你总数大小,您可以根据PageLayout.getPrintableWidth和getPrintableHeight对其进行划分,条件是用户可以在打印设置对话框中更改这些内容。

job.getJobSettings().setPageRanges(new PageRange(1, numPages));

告诉作业您可以提供多少页面。通常在显示打印对话框之前设置此项,以便用户可以选择要打印的页数,范围等。

显示对话框后,将使用用户选择的所选PageRanges更新JobSettings,然后循环并单独打印。

if (job.showPrintDialog(null)) {
    JobSettings js = job.getJobSettings();
    for (PageRange pr : js.getPageRanges()) {
        for (int p = pr.getStartPage(); p <= pr.getEndPage(); p++) {
            boolean ok = job.printPage(...code to get your node for the page...);
            ...take action on success/failure etc.
        }
    }
}