2016-04-11 1 views
2

Ich versuche, potenziell langen Text an einen Drucker zu senden, um ... nun, Drucken. Hier ist ein minimales Beispiel, das zeigt, wie ich zur Zeit Text am Druck:Wie handhabe ich Paginierung beim Drucken von Text?

@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"); 
    } 
} 

Der obige Code druckt den Text wie erwartet, mit der Ausnahme, dass, egal wie viel Text gedruckt wird, ist es immer druckt nur eine einzelne Seite. Im Druckdialog, der angezeigt wird, habe ich unter "Druckbereich" die Option "Alle" ausgewählt. Ich habe versucht, die Option "Seiten" zu wählen (die aus irgendeinem Grund von 1 bis 9999 ausfällt - das ist etwas merkwürdig, da der Text höchstens zwei Seiten lang sein sollte), aber hatte keinen Erfolg beim Drucken von mehr als a einzelne Seite. Ich habe auch versucht, den Seitenbereich auf dem Objekt JobSettings manuell einzustellen, aber das schien auch nichts zu tun.

enter image description here

Wie kann ich die PrinterJob und die zugehörigen Klassen ein langes Stück Text erhalten ordnungsgemäß auf mehreren Seiten drucken zu?

Antwort

1
Soweit ich weiß, müssen Sie mehrere Nodes, printAreas in Ihrem Fall, an den PrinterJob liefern, nachdem Sie sie zuvor in Ihrem Code aufgeteilt haben (leider ...). Wenn Sie Ihren TextFlow in einer gestylten Szene platzieren, erhalten Sie die Gesamtgröße können Sie diese basierend auf PageLayout.getPrintableWidth und getPrintableHeight unter der Voraussetzung aufteilen, dass der Benutzer diese im Dialogfeld für die Druckeinstellungen ändern kann.

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

Gibt dem Job an, wie viele Seiten Sie liefern können. In der Regel wird dies vor dem Anzeigen des Druckdialogs eingestellt, so dass der Benutzer wählen kann, wie viele Seiten gedruckt werden sollen, welcher Bereich usw.

Nach dem Anzeigen des Dialogs werden die JobSettings mit den ausgewählten PageRanges, die der Benutzer ausgewählt hat, aktualisiert Schleife über und drucke einzeln.

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. 
     } 
    } 
} 
+2

Anstatt mehrere Knoten des Druckens, I abgelaufenen in Pixel, die die Höhe des Druckbereichs der Berechnung auf, und unter Verwendung des 'setTranslateY()' Verfahren auf dem übergeordneten Knoten, um „die Seite zu verschieben up“ diesen Betrag vor dem Aufruf 'printPage()' erneut auf demselben Knoten. Nicht sicher, ob das der "richtige" Weg ist, Dinge zu tun, aber ich fand es am besten für meinen Fall. Danke für den Tipp! – Cypher

+0

Eine interessante Herangehensweise, bei der ich denke ... es könnte ein besserer Weg sein, mit Tabellen umzugehen als mein derzeitiger Ansatz. Vielen Dank! – Geoff

+0

@Cypher danke! Denkst du, du könntest ein vollständiges Codebeispiel bereitstellen? – cashmash