首页 > 解决方案 > 尝试打印包含来自 JavaFx 的图像的节点时的像素化结果

问题描述

我偶然发现了一个问题,试图通过 JavaFx 打印(到打印机或 pdf)图像。我的代码工作并打印,但在我尝试打印的每张图片上像素化(降低质量)。

我的代码是

package testingprinting;

import java.io.File;
import java.net.MalformedURLException;
import java.util.Iterator;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.print.PageLayout;
import javafx.print.PageOrientation;
import javafx.print.Paper;
import javafx.print.Printer;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;

/**
 *
 * @author me
 */
public class TestingPrinting extends Application {
    
    @Override
    public void start(Stage primaryStage) throws MalformedURLException {
 

       GridPane leftGridPane = new GridPane();
       
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));    
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25)); 
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));  
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));   
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));  
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));   
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));   
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));   
       leftGridPane.getColumnConstraints().add(new ColumnConstraints(824));    
        
        VBox root = new VBox(1);
        root.getChildren().add(leftGridPane);
        
        Scene scene = new Scene(root, 1024, 800);
        
        primaryStage.setTitle("Print Testing");
        primaryStage.setScene(scene);
        primaryStage.show();
        
        
       Image testImage = new Image(new File("C:\\Users\\me\\Documents\\800px-Gull_portrait_ca_usa.JPG").toURI().toURL().toExternalForm());
       ImageView testImageImageView = new ImageView();
       testImageImageView.setFitWidth(800);
       testImageImageView.setFitHeight(600);
       testImageImageView.setImage(testImage);
       leftGridPane.add(testImageImageView,0,0,9,1);  
        
        
       Button printButton = new Button("Print");
       root.getChildren().add(printButton);
       
        printButton.setOnAction(e -> {
        
        //Printer pdfPrinter = null;       
        Iterator<Printer> iter = Printer.getAllPrinters().iterator();
        while (iter.hasNext()) {
            Printer printer = iter.next();
            if (printer.getName().endsWith("PDF")) {
      //          pdfPrinter = printer;
            }
        }
           

        Printer printer = Printer.getDefaultPrinter();
        PageLayout pageLayout = printer.createPageLayout(Paper.NA_LETTER, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);
        double scaleX = pageLayout.getPrintableWidth() / leftGridPane.getBoundsInParent().getWidth();
        double scaleY = pageLayout.getPrintableHeight() / leftGridPane.getBoundsInParent().getHeight();
        //leftGridPane.getTransforms().add(new Scale(scaleX, scaleY));
        
        
        
        PrinterJob job = PrinterJob.createPrinterJob();
        if(job != null){
        System.out.println("Job is not null");
        job.showPrintDialog(primaryStage); // Window must be your main Stage
        job.printPage(leftGridPane);
        job.endJob();
 }
        else { job.cancelJob();        System.out.println("Job is null");}
        }
        );       
        
      
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}

正如您在我剪下的图片上看到的 1. 来自打印并且图像是像素化的,2. 来自我运行的代码并且它不是像素化的。 并排比较

有人知道如何解决这个问题吗?

先感谢您。

标签: javajavafxprinting

解决方案


您可以尝试将打印机作业的打印质量设置为高。创建打印机作业调用后

job.getJobSettings().setPrintQuality(PrintQuality.HIGH);

我没有时间尝试,但它可能会有所帮助。


推荐阅读