我有javafx.scene.image.Image类的对象。如何使用javafx8在打印机上打印?请注意,我不想打印某个节点,例如ImageView。我需要打印图像。虽然这是一个非常简单的问题,但我无法在互联网上找到答案。 我找到的唯一代码是:
PrinterJob job = PrinterJob.createPrinterJob();
if (job != null) {
boolean success = job.printPage(node);
if (success) {
job.endJob();
}
}
然而,它是关于打印节点。
答案 0 :(得分:2)
javafx.print。PrinterJob仅打印Node及其子类。 Image不是Node的子类。因此,您必须将其包装在Node(ImageView)中或从普通Java打印。
主要区别在于,引入了JavaFX PrinterJob以用于Node对象。它将一些有用的东西设置为JavaFX属性,如Jobstatus或Printer本身。而且它比旧的AWT PrinterJob更安全。 AWT PrinterJob可以打印任何你想要的东西,如字符串,图像,弧形等,因为它需要一个AWT图形对象来绘制页面上的东西。
在使用普通Java解决方案之前,您必须将FX-Image转换为SwingFXUtils.fromFXImage()的BufferedImage。但是* .jpg文件存在错误,如下所述:https://stackoverflow.com/a/30995307/4170073
下面的Minimal, Complete, and Verifiable example显示了一个可行的解决方案:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ImagePrinter extends Application {
@Override
public void start(Stage primaryStage) {
Image image = new Image("http://www.gnu.org/graphics/gnu-head.png");
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
Button btn = new Button();
btn.setText("Print Image");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
printImage(bufferedImage);
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Image Printer");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
private void printImage(BufferedImage image) {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
// Get the upper left corner that it printable
int x = (int) Math.ceil(pageFormat.getImageableX());
int y = (int) Math.ceil(pageFormat.getImageableY());
if (pageIndex != 0) {
return NO_SUCH_PAGE;
}
graphics.drawImage(image, x, y, image.getWidth(), image.getHeight(), null);
return PAGE_EXISTS;
}
});
try {
printJob.print();
} catch (PrinterException e1) {
e1.printStackTrace();
}
}
}