From 4439c4e82b873686771a6a8c4fb90cea8200540e Mon Sep 17 00:00:00 2001 From: LucasV-IUT Date: Tue, 7 Dec 2021 22:43:06 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20commentaires=20PDF,=20Page=20et=20Fen?= =?UTF-8?q?=C3=AAtre=20Modification=20recharger/charger=20=3D>=20charger?= =?UTF-8?q?=20uniquement=20Ajout=20affichage=20Vertical/Horizontal=20Metho?= =?UTF-8?q?des=20de=20Tests=20pour=20Page=20et=20Fen=C3=AAtre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lecteur_pdf/affichage/Fenetre.java | 130 ++++++++---------- src/lecteur_pdf/affichage/gestionFenetre.java | 106 +++++++------- src/lecteur_pdf/document/PDF.java | 29 ++-- src/lecteur_pdf/document/Page.java | 38 ++--- src/lecteur_pdf/menu/Menu.java | 10 +- tests/lecteur_pdf/affichage/FenetreTest.java | 19 +++ tests/lecteur_pdf/document/PDFTest.java | 25 +--- tests/lecteur_pdf/document/PageTest.java | 53 ++++--- 8 files changed, 187 insertions(+), 223 deletions(-) create mode 100644 tests/lecteur_pdf/affichage/FenetreTest.java diff --git a/src/lecteur_pdf/affichage/Fenetre.java b/src/lecteur_pdf/affichage/Fenetre.java index 61f9d2c..68238ce 100644 --- a/src/lecteur_pdf/affichage/Fenetre.java +++ b/src/lecteur_pdf/affichage/Fenetre.java @@ -23,52 +23,49 @@ import java.io.IOException; * @author Noé VILLENEUVE * @version 1.0 */ - public class Fenetre extends JFrame { - /** - * TODO - */ + /** Titre de la fenêtre */ private final String TITRE = "Lecteur PDF"; - /** - * TODO - */ + /** Le menu de la fenêtre */ private Menu menu; - /** - * TODO - */ + /** Le fichier courant */ private File fichier; + /** Le document PDF courant */ public PDF documentPDF; + /** Défini la disposition d'affichage des pages du document PDF */ private boolean affichageVertical; /** - * TODO + * Crée une nouvelle fenêtre contenant un Menu */ public Fenetre() { /* Change le style de la fenêtre */ try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (ClassNotFoundException - | InstantiationException - | IllegalAccessException - | UnsupportedLookAndFeelException e) { + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } - // Création du menu + /* Création du menu */ menu = new Menu(this); this.setJMenuBar(menu); + /* Definis l'affichage Vertical comme affichage par défaut */ this.affichageVertical = true; + /* Initialise l'état par défaut de la fenêtre */ setup(); } + /** + * Fonction utilitaire qui permet de définir l'état par défaut de la fenêtre + */ public void setup() { setTitle(TITRE); @@ -83,11 +80,42 @@ public class Fenetre extends JFrame { } /** - * TODO + * Charge le document PDF courant si possible * - * @param fichier + * @throws IOException Si l'on arrive pas a charger le PDF + */ + public void chargerPDF() throws IOException { + if (haveDocument()) chargerPDF(fichier, 1.0f); + } + + /** + * Charge le document PDF courant avec un zoom spécifique si possible + * + * @param zoom La taille du zoom sur les pages + * @throws IOException Si l'on arrive pas a charger le PDF + */ + public void chargerPDF(float zoom) throws IOException { + if (haveDocument()) chargerPDF(fichier, zoom); + } + + /** + * Charge un document PDF + * + * @param fichier Le fichier PDF à afficher dans la fenêtre + * @throws IOException Si l'on arrive pas a charger le PDF */ public void chargerPDF(File fichier) throws IOException { + chargerPDF(fichier, 1.0f); + } + + /** + * Charge un document PDF + * + * @param fichier Le fichier PDF à afficher dans la fenêtre + * @param zoom La taille du zoom sur les pages + * @throws IOException Si l'on arrive pas a charger le PDF + */ + public void chargerPDF(File fichier, float zoom) throws IOException { dechargerPDF(); this.fichier = fichier; @@ -100,50 +128,10 @@ public class Fenetre extends JFrame { scrollPane.getHorizontalScrollBar().setUnitIncrement(16); this.add(scrollPane, BorderLayout.CENTER); - documentPDF = new PDF(fichier, affichageVertical); - pdfPanel.add(documentPDF); - - /* Charge les pages */ - documentPDF.loadPages(); - - /* Met à jour la page */ - this.setTitle(TITRE + " | " + fichier.getName()); - this.validate(); - this.pack(); - this.setLocationRelativeTo(null); - } - - /** - * - * @throws IOException - */ - public void rechargerPDF() throws IOException { - rechargerPDF(1.0f); - } - - /** - * - * @param zoom - * @throws IOException - */ - public void rechargerPDF(float zoom) throws IOException { - dechargerPDF(); - - /* Crée le panel qui contient le document PDF */ - JPanel pdfPanel = new JPanel(); - /* Crée l’élément scrollable */ - JScrollPane scrollPane = new JScrollPane(pdfPanel); - scrollPane.getVerticalScrollBar().setUnitIncrement(16); - scrollPane.getHorizontalScrollBar().setUnitIncrement(16); - this.add(scrollPane); - documentPDF = new PDF(fichier, affichageVertical); documentPDF.setZoom(zoom); pdfPanel.add(documentPDF); - /* Charge les pages */ - documentPDF.loadPages(); - /* Met à jour la page */ this.setTitle(TITRE + " | " + fichier.getName()); this.validate(); @@ -152,7 +140,7 @@ public class Fenetre extends JFrame { } /** - * + * Supprime le PDF de la fenêtre */ public void dechargerPDF() { if (this.getContentPane() != null) { @@ -161,24 +149,22 @@ public class Fenetre extends JFrame { } } + /** + * Prédicat qui vérifie si un PDF est affiché dans la fenêtre + * + * @return true si le prédicat est vérifié, false sinon + */ public boolean haveDocument() { return documentPDF != null; } + /** + * Définis le mode d'affichage du PDF + * + * @param affichageVertical true pour un affichage Vertical, false pour + * un affichage horizontal + */ public void setAffichageVertical(boolean affichageVertical) { this.affichageVertical = affichageVertical; } - - public boolean isAffichageVertical() { - return affichageVertical; - } - - /** - * TODO comment main - * - * @param args non utilisé - */ - public static void main(String[] args) { - new Fenetre(); - } } \ No newline at end of file diff --git a/src/lecteur_pdf/affichage/gestionFenetre.java b/src/lecteur_pdf/affichage/gestionFenetre.java index bca2cae..38bb0c1 100644 --- a/src/lecteur_pdf/affichage/gestionFenetre.java +++ b/src/lecteur_pdf/affichage/gestionFenetre.java @@ -1,58 +1,48 @@ -/* - * gestionFenetre, 22/11/2021 - * IUT Rodez 2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.affichage; - -import lecteur_pdf.document.PDF; -import lecteur_pdf.menu.Menu; - -import javax.swing.*; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - -/** - * classe de gestion des fenêtres - * - * @author Léo FRANCH - * @author Tristan NOGARET - * @author Lucàs VABRE - * @author Noé VILLENEUVE - * @version 1.0 - */ -public class gestionFenetre { - - - final int NB_MAX_FENETRE = 2 ; - private Fenetre[] fenetresOuvertes; - File fichier = null ; - - - public void ouvrirFenetre(){ - int placeVide; - for (placeVide=0; placeVide<2; placeVide++){ - if (fenetresOuvertes[placeVide]==null){ - break; - } - } - if(placeVide==2) { - //todo erreur trop de fenetres - }else { - Fenetre fenetre = new Fenetre(); - fenetresOuvertes[placeVide] = fenetre; - } - } - public void fermerFenetre(JFrame fenetre){ - for (int i = 0; i<2 ; i++){ - if (fenetre==fenetresOuvertes[i]){ - fenetre.dispose(); - fenetresOuvertes[i]= null ; - } - } - } - - -} +///* +// * gestionFenetre, 22/11/2021 +// * IUT Rodez 2021, INFO2 +// * pas de copyright, aucun droits +// */ +// +//package lecteur_pdf.affichage; +// +//import javax.swing.*; +//import java.io.File; +// +///** +// * classe de gestion des fenêtres +// * +// * @author Léo FRANCH +// * @author Tristan NOGARET +// * @author Lucàs VABRE +// * @author Noé VILLENEUVE +// * @version 1.0 +// */ +//public class gestionFenetre { +// +// final int NB_MAX_FENETRE = 2 ; +// private Fenetre[] fenetresOuvertes; +// File fichier = null ; +// +// +// public void ouvrirFenetre(){ +// int placeVide; +// for (placeVide=0; placeVide<2; placeVide++){ +// if (fenetresOuvertes[placeVide] == null) break; +// } +// if(placeVide==2) { +// //todo erreur trop de fenetres +// }else { +// Fenetre fenetre = new Fenetre(); +// fenetresOuvertes[placeVide] = fenetre; +// } +// } +// public void fermerFenetre(JFrame fenetre){ +// for (int i = 0; i<2 ; i++){ +// if (fenetre==fenetresOuvertes[i]){ +// fenetre.dispose(); +// fenetresOuvertes[i]= null ; +// } +// } +// } +//} diff --git a/src/lecteur_pdf/document/PDF.java b/src/lecteur_pdf/document/PDF.java index 84fd12c..180d36a 100644 --- a/src/lecteur_pdf/document/PDF.java +++ b/src/lecteur_pdf/document/PDF.java @@ -23,27 +23,19 @@ import java.io.IOException; */ public class PDF extends JPanel { - /** - * Espacement entre chaque page - */ - public static final int OFFSET_PAGES = 10; // px - - /** - * Document PDF chargé - */ + /** Document chargé */ private final PDDocument document; - /** - * Les pages du PDF sous forme de JLabel contenant des images - */ + /** Les pages chargés */ private final Page[] pages; + /** Le zoom des pages du document */ private float zoom; /** - * Crée un document PDF qui est capable d’être affiché dans une fenêtre + * Crée un document PDF affichable dans une fenêtre * - * @param fichier Le fichier PDF que l’on veut ouvrir + * @param fichier Le fichier que l’on veut ouvrir * @throws IllegalArgumentException si le fichier n’existe pas */ public PDF(File fichier, boolean vertical) throws IOException { @@ -67,18 +59,15 @@ public class PDF extends JPanel { e.printStackTrace(); } } - - System.out.println("PDF: Loaded successfully"); } /** - * @return Le nombre de pages chargées + * Défini le zoom des pages du document + * + * @param zoom la nouvelle valeur du zoom (1.0f == 100%) */ - public int getNbPages() { - return document.getNumberOfPages(); - } - public void setZoom(float zoom) { this.zoom = zoom; + loadPages(); } } diff --git a/src/lecteur_pdf/document/Page.java b/src/lecteur_pdf/document/Page.java index fdff2cc..5e0b8f1 100644 --- a/src/lecteur_pdf/document/Page.java +++ b/src/lecteur_pdf/document/Page.java @@ -30,12 +30,6 @@ public class Page extends JLabel { /** Zoom de la page (1.0f == 100 %, 0.5 == 50%, ...) */ private final float ZOOM; - /** Hauteur de la page */ - private int hauteur; - - /** Largeur de la page */ - private int largeur; - /** Image de la page générée */ private final ImageIcon IMAGE_ICON; @@ -74,15 +68,13 @@ public class Page extends JLabel { public Page(PDDocument document, int index, float zoom) throws IllegalArgumentException, IOException { - if (!isValid(document, index)) { - throw new IllegalArgumentException(); - } + if (!isValid(document, index)) throw new IllegalArgumentException(); this.INDEX = index; this.ZOOM = zoom; - this.IMAGE_ICON = generateImage(document); + this.IMAGE_ICON = generateImage(document); // Génère la page - /* Render */ + /* Fait le rendu de la page */ this.setIcon(IMAGE_ICON); } @@ -109,30 +101,20 @@ public class Page extends JLabel { */ private ImageIcon generateImage(PDDocument document) throws IOException { + /* Défini la qualité de l’image par rapport au zoom */ final int DPI = 120; int imageScale = (ZOOM > 1.0f) ? Image.SCALE_SMOOTH : Image.SCALE_FAST; + /* Crée une image de la page à afficher */ PDFRenderer pdfRenderer = new PDFRenderer(document); BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(INDEX, DPI); - this.largeur = (int)(bufferedImage.getWidth() * ZOOM); - this.hauteur = (int)(bufferedImage.getHeight() * ZOOM); + /* Redimensionne l'image */ + final int LARGEUR = (int)(bufferedImage.getWidth() * ZOOM); + final int HAUTEUR = (int)(bufferedImage.getHeight() * ZOOM); - return new ImageIcon(bufferedImage.getScaledInstance(largeur, hauteur, + /* Retourne l’image à la bonne taille */ + return new ImageIcon(bufferedImage.getScaledInstance(LARGEUR, HAUTEUR, imageScale)); } - - /** - * @return La hauteur de la page - */ - public int getHauteur() { - return hauteur; - } - - /** - * @return La largeur de la page - */ - public int getLargeur() { - return largeur; - } } diff --git a/src/lecteur_pdf/menu/Menu.java b/src/lecteur_pdf/menu/Menu.java index 0e8afad..d436e52 100644 --- a/src/lecteur_pdf/menu/Menu.java +++ b/src/lecteur_pdf/menu/Menu.java @@ -242,21 +242,21 @@ public class Menu extends JMenuBar { } case "Zoom 150%" -> { try { - FENETRE.rechargerPDF(2.0f); + FENETRE.chargerPDF(2.0f); } catch (IOException e) { JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); } } case "Zoom 100%" -> { try { - FENETRE.rechargerPDF(1.0f); + FENETRE.chargerPDF(1.0f); } catch (IOException e) { JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); } } case "Zoom 50%" -> { try { - FENETRE.rechargerPDF(0.5f); + FENETRE.chargerPDF(0.5f); } catch (IOException e) { JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); } @@ -265,7 +265,7 @@ public class Menu extends JMenuBar { if (FENETRE.haveDocument()) { FENETRE.setAffichageVertical(true); try { - FENETRE.rechargerPDF(); + FENETRE.chargerPDF(); } catch (IOException e) { JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); } @@ -275,7 +275,7 @@ public class Menu extends JMenuBar { if (FENETRE.haveDocument()) { FENETRE.setAffichageVertical(false); try { - FENETRE.rechargerPDF(); + FENETRE.chargerPDF(); } catch (IOException e) { JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); } diff --git a/tests/lecteur_pdf/affichage/FenetreTest.java b/tests/lecteur_pdf/affichage/FenetreTest.java new file mode 100644 index 0000000..41b8195 --- /dev/null +++ b/tests/lecteur_pdf/affichage/FenetreTest.java @@ -0,0 +1,19 @@ +package lecteur_pdf.affichage; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class FenetreTest { + + // TODO + + /** + * Lance les methodes de tests + * + * @param args non utilisé + */ + public static void main(String[] args) { + new Fenetre(); + } +} \ No newline at end of file diff --git a/tests/lecteur_pdf/document/PDFTest.java b/tests/lecteur_pdf/document/PDFTest.java index a05480b..ca4270b 100644 --- a/tests/lecteur_pdf/document/PDFTest.java +++ b/tests/lecteur_pdf/document/PDFTest.java @@ -1,33 +1,14 @@ package lecteur_pdf.document; -import javax.swing.*; -import java.awt.*; -import java.io.File; - class PDFTest { /** - * TODO comment main + * Lance les methodes de tests * - * @param args + * @param args non utilisé */ public static void main(String[] args) { - JFrame frame = new JFrame(); - - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setLocationRelativeTo(null); - - frame.setSize(300,300); - frame.setBackground(Color.gray); - frame.setVisible(true); - - //PDF doc = new PDF(new File("C:/Users/public/test.pdf")); - - //JScrollPane scrollPane = new JScrollPane(doc); - //scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - //scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - //frame.add(scrollPane); - frame.validate(); + // TODO } } \ No newline at end of file diff --git a/tests/lecteur_pdf/document/PageTest.java b/tests/lecteur_pdf/document/PageTest.java index 81a1447..50328e3 100644 --- a/tests/lecteur_pdf/document/PageTest.java +++ b/tests/lecteur_pdf/document/PageTest.java @@ -3,32 +3,49 @@ package lecteur_pdf.document; import org.apache.pdfbox.pdmodel.PDDocument; import javax.swing.*; -import java.awt.*; import java.io.File; import java.io.IOException; class PageTest { + public static void testPage() { + try { + PDDocument document = PDDocument.load( + new File("Documents_PDF/paysage_35pages.pdf")); + JFrame frame = new JFrame(); + frame.setVisible(true); + frame.add(new Page(document, 0, 1.0f)); + frame.pack(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void testPageZoom() { + try { + PDDocument document = PDDocument.load( + new File("Documents_PDF/paysage_35pages.pdf")); + JFrame frame = new JFrame(); + frame.setVisible(true); + frame.add(new Page(document, 0, 2.0f)); + frame.pack(); + + JFrame frame2 = new JFrame(); + frame2.setVisible(true); + frame2.add(new Page(document, 0, 0.5f)); + frame2.pack(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** - * Test du constructeur {@link Page#Page(PDDocument, int)} + * Lance les methodes de tests * * @param args non utilisé */ - public static void main(String[] args) throws IOException { - /* Mise en place du JFrame de test */ - JFrame frame = new JFrame(); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setLocationRelativeTo(null); - frame.setSize(300, 300); - frame.setBackground(Color.gray); - frame.setVisible(true); - - /* Creation de l’objet Page */ - PDDocument document = PDDocument.load(new File("F:/paysage_35pages.pdf")); - Page page = new Page(document, 0); - - /* Ajout de l’objet dans la frame et mise à jour de la frame */ - // frame.add(page); - frame.validate(); + public static void main(String[] args) { + testPage(); + testPageZoom(); } } \ No newline at end of file