缩放后的模糊Pdf

问题描述 投票:0回答:1

我有一个使用Apache PdfBox开发的pdf阅读器,我的问题是缩放后我的图像模糊,即使pdf文件的分辨率非常好,这个问题也只存在于PDF中。此代码可与png或jpg文件一起很好地工作,但pdf文件仍然存在问题,我真的很困惑,我在google上搜索,但发现一些解决方案不完整。

控制器

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);
        }
    }
}

PdfModel

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>

Main.java

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *@author toru
 */
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Parent parent = FXMLLoader.load(getClass().getResource("ui.fxml"));
        primaryStage.setTitle("Zoom ImageView Demo ");
        primaryStage.setScene(new Scene(parent,800, 600));
        primaryStage.show();
     }
public static void main(String[] args) {

        launch(args);
    }

}

最诚挚的问候

javafx imageview zoom pdfbox blurry
1个回答
0
投票

使用二参数renderImage()方法。第二个参数是比例。 1是默认值,是72 dpi,4是288 dpi,通常很好。因此,我建议您从比例尺4开始,并在以后的步骤中增加缩放比例(请注意,在高分辨率下渲染可能会变慢)。

© www.soinside.com 2019 - 2024. All rights reserved.