gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:33:44 26 4
gpt4 key购买 nike

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

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

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

最佳答案

问题

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

JavaFX-PrinterJob 和 AWT-PrinterJob 的区别

主要区别在于,JavaFX PrinterJob 是为了与 Node 对象一起使用而引入的。它已将一些有用的东西设置为 JavaFX 属性,例如作业状态或打印机本身。与旧版 AWT PrinterJob 相比,它的线程安全性更高。 AWT PrinterJob 可以打印您想要的大部分内容,如字符串、图像、弧形等,因为它需要 AWT 图形对象在页面上绘制内容。

解决方案

在使用普通 Java 解决方案之前,您必须使用 SwingFXUtils.fromFXImage() 将 FX-Image 转换为 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();
}
}
}

关于java - 如何使用javafx8在打印机图像上打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com