diff --git a/src/lecteur_pdf/affichage/Fenetre.java b/src/lecteur_pdf/affichage/Fenetre.java index b5cbbaa..7c689b1 100644 --- a/src/lecteur_pdf/affichage/Fenetre.java +++ b/src/lecteur_pdf/affichage/Fenetre.java @@ -10,6 +10,7 @@ import lecteur_pdf.document.PDF; import lecteur_pdf.menu.Menu; import javax.swing.*; +import java.awt.*; import java.io.File; /** @@ -27,7 +28,7 @@ public class Fenetre extends JFrame { /** * TODO */ - private String titre; + private final String TITRE = "Lecteur PDF"; /** * TODO @@ -37,16 +38,28 @@ public class Fenetre extends JFrame { /** * TODO */ - private PDF fichierPDF; + private File fichier; + + private PDF documentPDF; /** * TODO */ public Fenetre() { + /* Change le style de la fenêtre */ + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException + | IllegalAccessException | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + // Création du menu menu = new Menu(this); + this.setTitle(TITRE); + // Ajout de la barre de menu au frame this.setJMenuBar(menu); @@ -62,24 +75,68 @@ public class Fenetre extends JFrame { * * @param fichier */ - public void chargerPdf(File fichier) { - fichierPDF = new PDF(fichier); + public void chargerPDF(File fichier) { + dechargerPDF(); + this.fichier = fichier; + + /* Crée le panel qui contient le document PDF */ + JPanel pdfPanel = new JPanel(); /* Crée l’élément scrollable */ - JScrollPane scrollPane = new JScrollPane(fichierPDF); - scrollPane.setHorizontalScrollBarPolicy( - JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy( - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + JScrollPane scrollPane = new JScrollPane(pdfPanel); scrollPane.getVerticalScrollBar().setUnitIncrement(16); + this.add(scrollPane, BorderLayout.CENTER); - /* Supprime le précédent PDF */ - this.getContentPane().removeAll(); + documentPDF = new PDF(fichier); + pdfPanel.add(documentPDF); - /* Affiche le nouveau PDF */ - scrollPane.setAlignmentX(JComponent.CENTER_ALIGNMENT); - this.getContentPane().add(scrollPane); + /* Ajoute le scrollPane et le centre dans la page */ + + /* Charge les pages */ + documentPDF.loadPages(); + + /* Met à jour la page */ + this.setTitle(TITRE + " | " + fichier.getName()); this.validate(); + this.pack(); + this.setLocationRelativeTo(null); + } + + /** + * + */ + public void rechargerPDF() { + 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); + this.add(scrollPane, BorderLayout.CENTER); + + documentPDF = new PDF(fichier); + pdfPanel.add(documentPDF); + + /* Ajoute le scrollPane et le centre dans la page */ + + /* Charge les pages */ + documentPDF.loadPages(); + + /* Met à jour la page */ + this.setTitle(TITRE + " | " + fichier.getName()); + this.validate(); + this.pack(); + this.setLocationRelativeTo(null); + } + + /** + * + */ + public void dechargerPDF() { + if (this.getContentPane() != null) { + this.getContentPane().removeAll(); + } } /** diff --git a/src/lecteur_pdf/document/PDF.java b/src/lecteur_pdf/document/PDF.java index 13058d1..80a0872 100644 --- a/src/lecteur_pdf/document/PDF.java +++ b/src/lecteur_pdf/document/PDF.java @@ -9,6 +9,7 @@ package lecteur_pdf.document; import org.apache.pdfbox.pdmodel.PDDocument; import javax.swing.*; +import java.awt.*; import java.io.File; import java.io.IOException; @@ -37,6 +38,8 @@ public class PDF extends JPanel { */ private final Page[] pages; + private float zoom; + /** * Crée un document PDF qui est capable d’être affiché dans une fenêtre * @@ -47,9 +50,10 @@ public class PDF extends JPanel { try { this.document = PDDocument.load(fichier); this.pages = new Page[document.getNumberOfPages()]; + this.zoom = 1.0f; - this.setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS)); - this.loadPages(); + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + this.setAlignmentX(Component.CENTER_ALIGNMENT); } catch (IOException e) { throw new IllegalArgumentException(); } @@ -58,19 +62,19 @@ public class PDF extends JPanel { /** * Charge toutes les pages du document PDF et les stocke dans le tableau */ - private void loadPages() { + public void loadPages() { - try { - for (int i = 0; i < pages.length; i++) { - /* Crée un JLabel de la page */ - pages[i] = new Page(document, i); + + for (int i = 0; i < pages.length; i++) { + try { + pages[i] = new Page(document, i, zoom); this.add(pages[i]); + } catch (IOException e) { + e.printStackTrace(); } - - System.out.println("PDF: Loaded successfully"); - } catch (IOException e) { - e.printStackTrace(); } + + System.out.println("PDF: Loaded successfully"); } /** @@ -79,4 +83,8 @@ public class PDF extends JPanel { public int getNbPages() { return document.getNumberOfPages(); } + + public void setZoom(float zoom) { + this.zoom = zoom; + } } diff --git a/src/lecteur_pdf/document/Page.java b/src/lecteur_pdf/document/Page.java index d7c60e9..aad2080 100644 --- a/src/lecteur_pdf/document/Page.java +++ b/src/lecteur_pdf/document/Page.java @@ -7,7 +7,6 @@ package lecteur_pdf.document; import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import javax.swing.*; @@ -25,16 +24,21 @@ import java.io.IOException; */ public class Page extends JLabel { - /** - * Hauteur de la page - */ + /** Indice de la page dans le document */ + private final int INDEX; + + /** 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 - */ + /** Largeur de la page */ private int largeur; + /** Image de la page générée */ + private final ImageIcon IMAGE_ICON; + /** * Crée une page virtuellement pour l’afficher avec java swing * @@ -50,7 +54,36 @@ public class Page extends JLabel { throw new IllegalArgumentException(); } - this.setIcon(generateImage(document, index)); + this.INDEX = index; + this.ZOOM = 1.0f; + this.IMAGE_ICON = generateImage(document, ZOOM); + + /* Render */ + this.setIcon(IMAGE_ICON); + } + + /** + * Crée une page virtuellement pour l’afficher avec java swing + * + * @param document Document pdf + * @param index indice de la page + * @param zoom Le zoom de la page + * @throws IllegalArgumentException Si les arguments ne sont pas valides + * @throws IOException Si la page n’as pas pu être lue + */ + public Page(PDDocument document, int index, float zoom) throws + IllegalArgumentException, + IOException { + if (!isValid(document, index)) { + throw new IllegalArgumentException(); + } + + this.INDEX = index; + this.ZOOM = zoom; + this.IMAGE_ICON = generateImage(document, ZOOM); + + /* Render */ + this.setIcon(IMAGE_ICON); } /** @@ -74,20 +107,19 @@ public class Page extends JLabel { * @return JLabel contenant la page sous forme d’image * @throws IOException En cas d’erreur de lecture */ - private ImageIcon generateImage(PDDocument document, int index) throws IOException { + private ImageIcon generateImage(PDDocument document, float scale) throws IOException { + + final int DPI = 120; + int imageScale = (scale > 1.0f) ? Image.SCALE_SMOOTH : Image.SCALE_FAST; PDFRenderer pdfRenderer = new PDFRenderer(document); - BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(index, - 300, - ImageType.RGB); + BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(INDEX, DPI); - this.largeur = bufferedImage.getWidth() / 2; - this.hauteur = bufferedImage.getHeight() / 2; + this.largeur = (int)(bufferedImage.getWidth() * scale); + this.hauteur = (int)(bufferedImage.getHeight() * scale); - final ImageIcon imageIcon = new ImageIcon( - bufferedImage.getScaledInstance(largeur, hauteur, - Image.SCALE_SMOOTH)); - return imageIcon; + return new ImageIcon(bufferedImage.getScaledInstance(largeur, hauteur, + imageScale)); } /** diff --git a/src/lecteur_pdf/menu/Menu.java b/src/lecteur_pdf/menu/Menu.java index e942a7d..63e1a41 100644 --- a/src/lecteur_pdf/menu/Menu.java +++ b/src/lecteur_pdf/menu/Menu.java @@ -102,7 +102,7 @@ public class Menu extends JMenuBar { switch (choice) { case "Ouvrir" -> { File fichier = SelectionnerFichier.ouvrirFichier(); - fenetre.chargerPdf(fichier); + fenetre.chargerPDF(fichier); } case "Fermer" -> System.exit( 0); // TODO à changer pour que ça quitte vraiment diff --git a/tests/lecteur_pdf/document/PageTest.java b/tests/lecteur_pdf/document/PageTest.java index 6bba430..81a1447 100644 --- a/tests/lecteur_pdf/document/PageTest.java +++ b/tests/lecteur_pdf/document/PageTest.java @@ -28,7 +28,7 @@ class PageTest { Page page = new Page(document, 0); /* Ajout de l’objet dans la frame et mise à jour de la frame */ - frame.add(page); + // frame.add(page); frame.validate(); } } \ No newline at end of file