From 18e5f2fd3cd1be786ede7263865067c3f0287904 Mon Sep 17 00:00:00 2001 From: LucasV-IUT Date: Sat, 4 Dec 2021 15:17:18 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Fenetre.chargerPdf:=20centre=20le=20PDF=20P?= =?UTF-8?q?DF.loadPages=20:=20possibilit=C3=A9=20de=20zoom=20+=20nouvelle?= =?UTF-8?q?=20methode=20de=20chargement=20(Test=20chargement=20asynchrone?= =?UTF-8?q?=20mais=20ne=20marche=20pas=20correctement)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lecteur_pdf/affichage/Fenetre.java | 38 +++++++++------ src/lecteur_pdf/document/PDF.java | 52 ++++++++++++++------- src/lecteur_pdf/document/Page.java | 59 ++++++------------------ src/lecteur_pdf/menu/Menu.java | 4 +- tests/lecteur_pdf/document/PageTest.java | 4 +- 5 files changed, 79 insertions(+), 78 deletions(-) diff --git a/src/lecteur_pdf/affichage/Fenetre.java b/src/lecteur_pdf/affichage/Fenetre.java index b5cbbaa..5e27590 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; /** @@ -63,23 +64,34 @@ public class Fenetre extends JFrame { * @param fichier */ public void chargerPdf(File fichier) { - fichierPDF = new PDF(fichier); - /* 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); + /* Décharge le précédent PDF avant de charger le prochain */ + dechargerPdf(); + + PDF fichierPDF = new PDF(fichier); + + /* Crée le panel qui contient le document PDF */ + JPanel mainPanel = new JPanel(); + mainPanel.add(fichierPDF); + + /* Crée l’élément scrollable qui contiendra le pannel */ + JScrollPane scrollPane = new JScrollPane(mainPanel); scrollPane.getVerticalScrollBar().setUnitIncrement(16); - /* Supprime le précédent PDF */ - this.getContentPane().removeAll(); + /* Ajoute l'élément scrollable a la fenêtre et le centre */ + this.add(scrollPane, BorderLayout.CENTER); - /* Affiche le nouveau PDF */ - scrollPane.setAlignmentX(JComponent.CENTER_ALIGNMENT); - this.getContentPane().add(scrollPane); - this.validate(); + /* Génère les pages */ + fichierPDF.loadPages(this, 1); + + 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..7f82fb5 100644 --- a/src/lecteur_pdf/document/PDF.java +++ b/src/lecteur_pdf/document/PDF.java @@ -6,11 +6,15 @@ package lecteur_pdf.document; +import lecteur_pdf.affichage.Fenetre; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; import javax.swing.*; +import java.awt.*; import java.io.File; import java.io.IOException; +import java.util.List; /** * Définis virtuellement un fichier PDF @@ -32,10 +36,7 @@ public class PDF extends JPanel { */ private final PDDocument document; - /** - * Les pages du PDF sous forme de JLabel contenant des images - */ - private final Page[] pages; + private List pages; /** * Crée un document PDF qui est capable d’être affiché dans une fenêtre @@ -46,10 +47,10 @@ public class PDF extends JPanel { public PDF(File fichier) { try { this.document = PDDocument.load(fichier); - this.pages = new Page[document.getNumberOfPages()]; + pages = this.document.getDocumentCatalog().getAllPages(); - 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 +59,36 @@ public class PDF extends JPanel { /** * Charge toutes les pages du document PDF et les stocke dans le tableau */ - private void loadPages() { + public void loadPages(Fenetre fenetre, int zoom) { - try { - for (int i = 0; i < pages.length; i++) { - /* Crée un JLabel de la page */ - pages[i] = new Page(document, i); - this.add(pages[i]); + + for (Object p : pages) { + if (p instanceof PDPage pdPage) { + try { + this.add(new Page(pdPage, zoom)); + } catch (IOException e) { + e.printStackTrace(); + } + fenetre.validate(); + + /* Méthode asynchrone (Ne marche pas bien) */ +// new Thread(() -> { +// try { +// this.add(new Page(pdPage, zoom)); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// fenetre.validate(); +// try { +// Thread.sleep(50); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// }).start(); } - - System.out.println("PDF: Loaded successfully"); - } catch (IOException e) { - e.printStackTrace(); } + + System.out.println("PDF: Loaded successfully"); } /** diff --git a/src/lecteur_pdf/document/Page.java b/src/lecteur_pdf/document/Page.java index d7c60e9..1875820 100644 --- a/src/lecteur_pdf/document/Page.java +++ b/src/lecteur_pdf/document/Page.java @@ -6,9 +6,7 @@ package lecteur_pdf.document; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.rendering.ImageType; -import org.apache.pdfbox.rendering.PDFRenderer; +import org.apache.pdfbox.pdmodel.PDPage; import javax.swing.*; import java.awt.*; @@ -25,69 +23,42 @@ import java.io.IOException; */ public class Page extends JLabel { - /** - * Hauteur de la page - */ + /** Hauteur de la page */ private int hauteur; - /** - * Largeur de la page - */ + /** Largeur de la page */ private int largeur; /** * Crée une page virtuellement pour l’afficher avec java swing * - * @param document Document pdf - * @param index indice de la page + * @param pageImage + * @param scale * @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) throws + public Page(PDPage pageImage, int scale) throws IllegalArgumentException, IOException { - if (!isValid(document, index)) { - throw new IllegalArgumentException(); - } + if (pageImage == null) throw new IllegalArgumentException(); - this.setIcon(generateImage(document, index)); - } - - /** - * Prédicat qui vérifie si une page est valide - * Le document ne doit pas être null et l’index doit être compris entre 0 - * et le nombre de pages du pdf. - * - * @param document Document pdf - * @param index indice de la page - * @return true si le prédicat est vérifié, false sinon - */ - private boolean isValid(PDDocument document, int index) { - return document != null && 0 <= index - && index < document.getNumberOfPages(); + this.setIcon(generateImage(pageImage.convertToImage(), scale)); } /** * Génère une image de la page * - * @param document Document PDF - * @return JLabel contenant la page sous forme d’image + * @param img + * @param scale * @throws IOException En cas d’erreur de lecture */ - private ImageIcon generateImage(PDDocument document, int index) throws IOException { + private ImageIcon generateImage(BufferedImage img, int scale) throws IOException { - PDFRenderer pdfRenderer = new PDFRenderer(document); - BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(index, - 300, - ImageType.RGB); + this.largeur = img.getWidth() / scale; + this.hauteur = img.getHeight() / scale; - this.largeur = bufferedImage.getWidth() / 2; - this.hauteur = bufferedImage.getHeight() / 2; - - final ImageIcon imageIcon = new ImageIcon( - bufferedImage.getScaledInstance(largeur, hauteur, - Image.SCALE_SMOOTH)); - return imageIcon; + return new ImageIcon(img.getScaledInstance(largeur, hauteur, + Image.SCALE_SMOOTH)); } /** diff --git a/src/lecteur_pdf/menu/Menu.java b/src/lecteur_pdf/menu/Menu.java index e942a7d..7751ee8 100644 --- a/src/lecteur_pdf/menu/Menu.java +++ b/src/lecteur_pdf/menu/Menu.java @@ -104,8 +104,8 @@ public class Menu extends JMenuBar { File fichier = SelectionnerFichier.ouvrirFichier(); fenetre.chargerPdf(fichier); } - case "Fermer" -> System.exit( - 0); // TODO à changer pour que ça quitte vraiment + 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 2ca5f49..f55a4f2 100644 --- a/tests/lecteur_pdf/document/PageTest.java +++ b/tests/lecteur_pdf/document/PageTest.java @@ -25,10 +25,10 @@ class PageTest { /* Creation de l’objet Page */ PDDocument document = PDDocument.load(new File("F:/test_pdf1.pdf")); - Page page = new Page(document, 0); + // 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 From 678fbf42b49082d27f78c9b17bc1e3a82da33054 Mon Sep 17 00:00:00 2001 From: LucasV-IUT Date: Mon, 6 Dec 2021 20:30:32 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Ajout=20de=20la=20possibilit=C3=A9=20de=20z?= =?UTF-8?q?oom=20avec=20rechargerPDF()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lecteur_pdf/affichage/Fenetre.java | 79 ++++++++++++++++++----- src/lecteur_pdf/document/PDF.java | 48 ++++++-------- src/lecteur_pdf/document/Page.java | 87 ++++++++++++++++++++++---- src/lecteur_pdf/menu/Menu.java | 6 +- 4 files changed, 158 insertions(+), 62 deletions(-) diff --git a/src/lecteur_pdf/affichage/Fenetre.java b/src/lecteur_pdf/affichage/Fenetre.java index 5e27590..7c689b1 100644 --- a/src/lecteur_pdf/affichage/Fenetre.java +++ b/src/lecteur_pdf/affichage/Fenetre.java @@ -28,7 +28,7 @@ public class Fenetre extends JFrame { /** * TODO */ - private String titre; + private final String TITRE = "Lecteur PDF"; /** * TODO @@ -38,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); @@ -63,32 +75,65 @@ public class Fenetre extends JFrame { * * @param fichier */ - public void chargerPdf(File fichier) { + public void chargerPDF(File fichier) { + dechargerPDF(); - /* Décharge le précédent PDF avant de charger le prochain */ - dechargerPdf(); - - PDF fichierPDF = new PDF(fichier); + this.fichier = fichier; /* Crée le panel qui contient le document PDF */ - JPanel mainPanel = new JPanel(); - mainPanel.add(fichierPDF); - - /* Crée l’élément scrollable qui contiendra le pannel */ - JScrollPane scrollPane = new JScrollPane(mainPanel); + JPanel pdfPanel = new JPanel(); + /* Crée l’élément scrollable */ + JScrollPane scrollPane = new JScrollPane(pdfPanel); scrollPane.getVerticalScrollBar().setUnitIncrement(16); - - /* Ajoute l'élément scrollable a la fenêtre et le centre */ this.add(scrollPane, BorderLayout.CENTER); - /* Génère les pages */ - fichierPDF.loadPages(this, 1); + 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() { + /** + * + */ + 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 7f82fb5..80a0872 100644 --- a/src/lecteur_pdf/document/PDF.java +++ b/src/lecteur_pdf/document/PDF.java @@ -6,15 +6,12 @@ package lecteur_pdf.document; -import lecteur_pdf.affichage.Fenetre; import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; import javax.swing.*; import java.awt.*; import java.io.File; import java.io.IOException; -import java.util.List; /** * Définis virtuellement un fichier PDF @@ -36,7 +33,12 @@ public class PDF extends JPanel { */ private final PDDocument document; - private List pages; + /** + * Les pages du PDF sous forme de JLabel contenant des images + */ + private final Page[] pages; + + private float zoom; /** * Crée un document PDF qui est capable d’être affiché dans une fenêtre @@ -47,7 +49,8 @@ public class PDF extends JPanel { public PDF(File fichier) { try { this.document = PDDocument.load(fichier); - pages = this.document.getDocumentCatalog().getAllPages(); + this.pages = new Page[document.getNumberOfPages()]; + this.zoom = 1.0f; this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.setAlignmentX(Component.CENTER_ALIGNMENT); @@ -59,32 +62,15 @@ public class PDF extends JPanel { /** * Charge toutes les pages du document PDF et les stocke dans le tableau */ - public void loadPages(Fenetre fenetre, int zoom) { + public void loadPages() { - for (Object p : pages) { - if (p instanceof PDPage pdPage) { - try { - this.add(new Page(pdPage, zoom)); - } catch (IOException e) { - e.printStackTrace(); - } - fenetre.validate(); - - /* Méthode asynchrone (Ne marche pas bien) */ -// new Thread(() -> { -// try { -// this.add(new Page(pdPage, zoom)); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// fenetre.validate(); -// try { -// Thread.sleep(50); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// }).start(); + 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(); } } @@ -97,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 1875820..aad2080 100644 --- a/src/lecteur_pdf/document/Page.java +++ b/src/lecteur_pdf/document/Page.java @@ -6,7 +6,8 @@ package lecteur_pdf.document; -import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.PDFRenderer; import javax.swing.*; import java.awt.*; @@ -23,42 +24,102 @@ import java.io.IOException; */ public class Page extends JLabel { + /** 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 */ 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 * - * @param pageImage - * @param scale + * @param document Document pdf + * @param index indice 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(PDPage pageImage, int scale) throws + public Page(PDDocument document, int index) throws IllegalArgumentException, IOException { - if (pageImage == null) throw new IllegalArgumentException(); + if (!isValid(document, index)) { + throw new IllegalArgumentException(); + } - this.setIcon(generateImage(pageImage.convertToImage(), scale)); + 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); + } + + /** + * Prédicat qui vérifie si une page est valide + * Le document ne doit pas être null et l’index doit être compris entre 0 + * et le nombre de pages du pdf. + * + * @param document Document pdf + * @param index indice de la page + * @return true si le prédicat est vérifié, false sinon + */ + private boolean isValid(PDDocument document, int index) { + return document != null && 0 <= index + && index < document.getNumberOfPages(); } /** * Génère une image de la page * - * @param img - * @param scale + * @param document Document PDF + * @return JLabel contenant la page sous forme d’image * @throws IOException En cas d’erreur de lecture */ - private ImageIcon generateImage(BufferedImage img, int scale) throws IOException { + private ImageIcon generateImage(PDDocument document, float scale) throws IOException { - this.largeur = img.getWidth() / scale; - this.hauteur = img.getHeight() / scale; + final int DPI = 120; + int imageScale = (scale > 1.0f) ? Image.SCALE_SMOOTH : Image.SCALE_FAST; - return new ImageIcon(img.getScaledInstance(largeur, hauteur, - Image.SCALE_SMOOTH)); + PDFRenderer pdfRenderer = new PDFRenderer(document); + BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(INDEX, DPI); + + this.largeur = (int)(bufferedImage.getWidth() * scale); + this.hauteur = (int)(bufferedImage.getHeight() * scale); + + 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 7751ee8..63e1a41 100644 --- a/src/lecteur_pdf/menu/Menu.java +++ b/src/lecteur_pdf/menu/Menu.java @@ -102,10 +102,10 @@ 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 + case "Fermer" -> System.exit( + 0); // TODO à changer pour que ça quitte vraiment } }