Javafx 缩放后的模糊Pdf

Javafx 缩放后的模糊Pdf,javafx,imageview,zooming,pdfbox,blurry,Javafx,Imageview,Zooming,Pdfbox,Blurry,我有一个使用ApachePDFBox开发的pdf阅读器,我的问题是缩放后图像模糊,这个问题只存在于pdf,即使pdf文件的分辨率非常好。 这段代码可以很好地处理png或jpg文件,但pdf文件的问题仍然存在,我真的很困惑,我在谷歌上搜索,但我发现了一些不完整的解决方案 控制器 package application; import java.nio.file.Paths; import javafx.beans.InvalidationListener; import javafx.beans.

我有一个使用ApachePDFBox开发的pdf阅读器,我的问题是缩放后图像模糊,这个问题只存在于pdf,即使pdf文件的分辨率非常好。 这段代码可以很好地处理png或jpg文件,但pdf文件的问题仍然存在,我真的很困惑,我在谷歌上搜索,但我发现了一些不完整的解决方案

控制器

package application;
import java.nio.file.Paths;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.fxml.FXML;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
public class Controller {


    String imagePath = "C:\\Users\\piratack007\\Desktop\\1.jpg";
    private ImageView imageView = new ImageView();

    String path="C:\\Users\\piratack007\\Desktop\\file.pdf";
    private PdfModel model= new PdfModel(Paths.get(path));
    private ScrollPane scrollPane = new ScrollPane();
    private DoubleProperty zoom = new SimpleDoubleProperty(1.1);
    private PageDimensions currentPageDimensions ;
    @FXML private VBox vbox;


    String cssLayout = "-fx-border-color: red;\n" +
            "-fx-border-insets: 5;\n" +
            "-fx-border-width: 3;\n" +
            "-fx-border-style: dashed;\n";

    String scrollCssLayout= "-fx-border-color: green;\n" +
            "-fx-border-insets: 5;\n" +
            "-fx-border-width: 3;\n" +
            "-fx-border-style: dashed;\n"+
            //Ne pas afficher le petit trait gris
            "-fx-background-color:transparent";

    public void initialize() {

        afficheImage();

     }
    void afficheImage() {

        /*try {
            imageView = new ImageView(new Image(new FileInputStream(imagePath)));

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        //loading the first page
        imageView = new ImageView(model.getImage(0));
        System.out.print("1-imageView.getFitHeight(): "+imageView.getImage().getHeight()+"\n");
        System.out.print("imageView.getFitWidth(): "+imageView.getImage().getWidth()+"\n");
        currentPageDimensions = new PageDimensions(imageView.getImage().getWidth(), imageView.getImage().getHeight());


     zoom.addListener(new InvalidationListener() {
         @Override
         public void invalidated(Observable arg0) {
             //My problem is in this part of code
         int width = (int) (imageView.getImage().getWidth() * zoom.get());
         int height = (int) (imageView.getImage().getHeight() * zoom.get());
         imageView.setFitWidth(width);
         System.out.print("Largeur: "+ (width)  +"px\n");
         imageView.setFitHeight(height);
         System.out.print("Hauteur: "+ height +"px\n");
             //==================================================
          }
     });
        imageView.preserveRatioProperty().set(true);
        scrollPane.setPannable(true);
        scrollPane.setStyle(scrollCssLayout);
        scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
        scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
        scrollPane.setContent(imageView);
        vbox.setStyle(cssLayout);
        vbox.getChildren().add(scrollPane);

    }

    @FXML private void zoomIn() {
        zoom.set(zoom.get()*1.1);
        // System.out.print("zoom.get(): "+zoom.get()*100 +"%\n");
    }

    @FXML private void zoomOut() {
        zoom.set(zoom.get()/1.1);
        // System.out.print("zoom.get(): "+zoom.get()*100 +"%\n");
    }
    @FXML private void zoomFit() {

    }
    @FXML private void zoomWidth() {

    }
    private class PageDimensions {
        private double width ;
        private double height ;
        PageDimensions(double width, double height) {
            this.width = width ;
            this.height = height ;
        }
        @Override
        public String toString() {
            return String.format("[%.1f, %.1f]", width, height);
        }
    }
}

PDF模型

package application;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.rendering.PDFRenderer;

/**
 * @author toru
 */
class PdfModel {
    //private static final Logger logger = Logger.getLogger(PdfModel.class.getName());

    private PDDocument document;
    private PDFRenderer renderer;

    Path chemin;
    PdfModel() {

    }

    PdfModel(Path path) {
        try {
            chemin=path;
            document = PDDocument.load(path.toFile());
            renderer = new PDFRenderer(document);
        } catch (IOException ex) {
            throw new UncheckedIOException("PDDocument thorws IOException file=" + path, ex);
        }
    }

    int nombreDePages() {
        return document.getPages().getCount();
    } 

    PDPage getPage (int num) {

        PDPage page = document.getPage(num);
        return page;
    }

    void fermer() {
        try {
            document.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    void setPath(Path pPays)
      {
       chemin = pPays;
       System.out.println("On est dans la page pdfmodel");
       System.out.println("Path: "+pPays);
      }

    Image getImage(int pageNumber) {
        BufferedImage pageImage;

        try {
            pageImage = renderer.renderImage(pageNumber);
        } catch (IOException ex) {
            throw new UncheckedIOException("PDFRenderer throws IOException", ex);
        }
        return SwingFXUtils.toFXImage(pageImage, null);
    }

}
ui.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="10.0" minWidth="10.0" prefHeight="400.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
   <bottom>
      <HBox prefHeight="50.0" prefWidth="400.0" BorderPane.alignment="CENTER">
         <children>
            <Button mnemonicParsing="false" onAction="#zoomIn" text="+">
               <HBox.margin>
                  <Insets left="5.0" top="5.0" />
               </HBox.margin>
            </Button>
            <Button mnemonicParsing="false" onAction="#zoomOut" text="-">
               <HBox.margin>
                  <Insets left="5.0" top="5.0" />
               </HBox.margin>
            </Button>
            <Button mnemonicParsing="false" onAction="#zoomFit" text="ZoomFit">
               <HBox.margin>
                  <Insets left="5.0" top="5.0" />
               </HBox.margin>
            </Button>
            <Button mnemonicParsing="false" onAction="#zoomWidth" text="ZoomWidth">
               <HBox.margin>
                  <Insets left="5.0" top="5.0" />
               </HBox.margin>
            </Button>
         </children>
      </HBox>
   </bottom>
   <center>
      <VBox fx:id="vbox" prefHeight="350.0" prefWidth="400.0" BorderPane.alignment="CENTER" />
   </center>
</BorderPane>


致以最诚挚的问候

使用双参数
渲染(页面,比例)
方法。1为默认刻度,为72 dpi,4为288 dpi,通常相当不错。因此,我建议您从比例4开始,在稍后的步骤中,在缩放时增加比例(请注意,分辨率越高,渲染速度可能越慢)

因此,您的代码的代码示例如下

pageImage = renderer.renderImage(pageNumber, 4);
pageImage = renderer.renderImage(pageNumber, 4);