如何使用javafx8在打印机图像上打印

时间:2015-06-28 13:14:55

标签: java javafx

我有javafx.scene.image.Image类的对象。如何使用javafx8在打印机上打印?请注意,我不想打印某个节点,例如ImageView。我需要打印图像。虽然这是一个非常简单的问题,但我无法在互联网上找到答案。 我找到的唯一代码是:

PrinterJob job = PrinterJob.createPrinterJob();
if (job != null) {
boolean success = job.printPage(node);
if (success) {
job.endJob();
}
}

然而,它是关于打印节点。

1 个答案:

答案 0 :(得分:2)

问题

javafx.print。PrinterJob仅打印Node及其子类。 Image不是Node的子类。因此,您必须将其包装在Node(ImageView)中或从普通Java打印。

JavaFX-PrinterJob和AWT-PrinterJob

的区别

主要区别在于,引入了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();
    }
  }
}