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

Java 打印文本时如何处理分页?,java,javafx,printing,javafx-8,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.

我正在尝试向打印机发送一些可能很长的文本,以便。。。嗯,印刷。下面是一个演示我当前如何打印文本的简单示例:

@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
对象上手动设置页面范围,但这似乎也没有任何作用


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

据我所知,您需要为PrinterJob提供多个节点,在您的情况下是打印区域,在代码中预先将它们分割(不幸的是…)将文本流放置在样式化的场景中会得到总大小,您可以根据PageLayout.getPrintableWidth和getPrintableHeight将其划分,但前提是用户可以在“打印设置”对话框中更改这些大小

job.getJobSettings().setPageRanges(new PageRange(1, numPages));
告诉作业您可以提供多少页。通常在显示“打印”对话框之前设置此选项,以便用户可以选择要打印的页面数、范围等

显示对话框后,作业设置将使用用户选择的页面范围进行更新,然后循环并单独打印

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.
        }
    }
}
if(job.showPrintDialog(null)){
JobSettings js=job.getJobSettings();
对于(PageRange pr:js.getPageRanges()){

对于(int p=pr.getStartPage();p,我没有打印多个节点,而是计算了可打印区域的高度(以像素为单位),并在父节点上使用
setTranslateY()
方法“向上移动页面”,然后在同一节点上再次调用
printPage()
。不确定这是否“正确”方法,但我发现它对我的情况来说是最好的。谢谢你的提示!这是一种有趣的方法,让我思考…这可能是一种比我目前的方法更好的处理表格的方法。谢谢!@Cypher谢谢!你认为你能提供完整的代码示例吗?如何获得每页的纸质源代码?@Arpan作业设置对象包含用户在“打印”对话框中选择的纸张来源和页面布局。