我正在尝试将一些可能很长的文本发送到打印机......好吧,打印。这是一个最小的例子,演示了我当前如何打印文本:
@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
及其相关类来获取一长段文本以在多个页面上正确打印?
答案 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.
}
}
}