IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Apache PDFBox, pdf floue apres le zoom


Sujet :

JavaFX

  1. #1
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Par défaut Apache PDFBox, pdf floue apres le zoom
    Bonjour

    J'ai un outil de lecture de fichier pdf développé en utilisant apache pdfbox, mon problème est que la page pdf devient floue si je zoom, sachant que la résolution est top, le problème c'est ce code fonctionne parfaitement avec des image tel que jpeg png etc.. mais avec les fichier pdf c la catastrophe, je vous en serai très reconnaissant si quels'un pourrai m'aider avec un affichage correct après le zoom
    Controller.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    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();
     		}*/
    		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) {
     
             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.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    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);
        }
     
    }
    Main.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    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);
    	}
     
    }
    ui.fxml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <?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>

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Je connais aucune solution pour ce soucis. C'est un defaut de JavaFX depuis la toute première version : il est impossible de contrôler l'algorithme de mise a l’échelle des images donc par défaut un smooth de la texture est applique lorsqu'on zoom trop.

    Depuis JavaFX 12 il est possible de désactiver (en théorie, pas testé) le flou lors du rendu des bitmap dans un GraphicContext (lorsqu'on dessine une image dans un Canvas donc). Par contre pour la classe Image et ImageView, ce flag (qui existe depuis bien avant JavaFX 12) n'a jamais fonctionne.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/02/2013, 16h51
  2. affichage d'une courbe après un zoom
    Par oliv27400 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/10/2010, 15h04
  3. Réponses: 3
    Dernier message: 06/05/2010, 17h19
  4. Alive PDF Ecrire Après GRID
    Par npirard dans le forum Flex
    Réponses: 0
    Dernier message: 20/04/2010, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo