Fenetre.chargerPdf: centre le PDF

PDF.loadPages : possibilité de zoom + nouvelle methode de chargement
(Test chargement asynchrone mais ne marche pas correctement)
This commit is contained in:
LucasV-IUT
2021-12-04 15:17:18 +01:00
parent 490350acbd
commit 18e5f2fd3c
5 changed files with 79 additions and 78 deletions
+25 -13
View File
@@ -10,6 +10,7 @@ import lecteur_pdf.document.PDF;
import lecteur_pdf.menu.Menu; import lecteur_pdf.menu.Menu;
import javax.swing.*; import javax.swing.*;
import java.awt.*;
import java.io.File; import java.io.File;
/** /**
@@ -63,23 +64,34 @@ public class Fenetre extends JFrame {
* @param fichier * @param fichier
*/ */
public void chargerPdf(File fichier) { public void chargerPdf(File fichier) {
fichierPDF = new PDF(fichier);
/* Crée l’élément scrollable */ /* Décharge le précédent PDF avant de charger le prochain */
JScrollPane scrollPane = new JScrollPane(fichierPDF); dechargerPdf();
scrollPane.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); PDF fichierPDF = new PDF(fichier);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); /* 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); scrollPane.getVerticalScrollBar().setUnitIncrement(16);
/* Supprime le précédent PDF */ /* Ajoute l'élément scrollable a la fenêtre et le centre */
this.getContentPane().removeAll(); this.add(scrollPane, BorderLayout.CENTER);
/* Affiche le nouveau PDF */ /* Génère les pages */
scrollPane.setAlignmentX(JComponent.CENTER_ALIGNMENT); fichierPDF.loadPages(this, 1);
this.getContentPane().add(scrollPane);
this.validate(); this.pack();
this.setLocationRelativeTo(null);
}
public void dechargerPdf() {
if (this.getContentPane() != null) {
this.getContentPane().removeAll();
}
} }
/** /**
+33 -15
View File
@@ -6,11 +6,15 @@
package lecteur_pdf.document; package lecteur_pdf.document;
import lecteur_pdf.affichage.Fenetre;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import javax.swing.*; import javax.swing.*;
import java.awt.*;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
/** /**
* Définis virtuellement un fichier PDF * Définis virtuellement un fichier PDF
@@ -32,10 +36,7 @@ public class PDF extends JPanel {
*/ */
private final PDDocument document; private final PDDocument document;
/** private List pages;
* Les pages du PDF sous forme de JLabel contenant des images
*/
private final Page[] pages;
/** /**
* Crée un document PDF qui est capable d’être affiché dans une fenêtre * 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) { public PDF(File fichier) {
try { try {
this.document = PDDocument.load(fichier); 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.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.loadPages(); this.setAlignmentX(Component.CENTER_ALIGNMENT);
} catch (IOException e) { } catch (IOException e) {
throw new IllegalArgumentException(); 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 * Charge toutes les pages du document PDF et les stocke dans le tableau
*/ */
private void loadPages() { public void loadPages(Fenetre fenetre, int zoom) {
for (Object p : pages) {
if (p instanceof PDPage pdPage) {
try { try {
for (int i = 0; i < pages.length; i++) { this.add(new Page(pdPage, zoom));
/* Crée un JLabel de la page */
pages[i] = new Page(document, i);
this.add(pages[i]);
}
System.out.println("PDF: Loaded successfully");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); 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");
} }
/** /**
+14 -43
View File
@@ -6,9 +6,7 @@
package lecteur_pdf.document; package lecteur_pdf.document;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
@@ -25,69 +23,42 @@ import java.io.IOException;
*/ */
public class Page extends JLabel { public class Page extends JLabel {
/** /** Hauteur de la page */
* Hauteur de la page
*/
private int hauteur; private int hauteur;
/** /** Largeur de la page */
* Largeur de la page
*/
private int largeur; private int largeur;
/** /**
* Crée une page virtuellement pour lafficher avec java swing * Crée une page virtuellement pour lafficher avec java swing
* *
* @param document Document pdf * @param pageImage
* @param index indice de la page * @param scale
* @throws IllegalArgumentException Si les arguments ne sont pas valides * @throws IllegalArgumentException Si les arguments ne sont pas valides
* @throws IOException Si la page nas pas pu être lue * @throws IOException Si la page nas pas pu être lue
*/ */
public Page(PDDocument document, int index) throws public Page(PDPage pageImage, int scale) throws
IllegalArgumentException, IllegalArgumentException,
IOException { IOException {
if (!isValid(document, index)) { if (pageImage == null) throw new IllegalArgumentException();
throw new IllegalArgumentException();
}
this.setIcon(generateImage(document, index)); this.setIcon(generateImage(pageImage.convertToImage(), scale));
}
/**
* Prédicat qui vérifie si une page est valide
* Le document ne doit pas être null et lindex 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 * Génère une image de la page
* *
* @param document Document PDF * @param img
* @return JLabel contenant la page sous forme dimage * @param scale
* @throws IOException En cas derreur de lecture * @throws IOException En cas derreur 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); this.largeur = img.getWidth() / scale;
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(index, this.hauteur = img.getHeight() / scale;
300,
ImageType.RGB);
this.largeur = bufferedImage.getWidth() / 2; return new ImageIcon(img.getScaledInstance(largeur, hauteur,
this.hauteur = bufferedImage.getHeight() / 2;
final ImageIcon imageIcon = new ImageIcon(
bufferedImage.getScaledInstance(largeur, hauteur,
Image.SCALE_SMOOTH)); Image.SCALE_SMOOTH));
return imageIcon;
} }
/** /**
+2 -2
View File
@@ -104,8 +104,8 @@ public class Menu extends JMenuBar {
File fichier = SelectionnerFichier.ouvrirFichier(); File fichier = SelectionnerFichier.ouvrirFichier();
fenetre.chargerPdf(fichier); fenetre.chargerPdf(fichier);
} }
case "Fermer" -> System.exit( case "Fermer" -> System.exit(0);
0); // TODO à changer pour que ça quitte vraiment // TODO à changer pour que ça quitte vraiment
} }
} }
+2 -2
View File
@@ -25,10 +25,10 @@ class PageTest {
/* Creation de lobjet Page */ /* Creation de lobjet Page */
PDDocument document = PDDocument.load(new File("F:/test_pdf1.pdf")); PDDocument document = PDDocument.load(new File("F:/test_pdf1.pdf"));
Page page = new Page(document, 0); // Page page = new Page(document, 0);
/* Ajout de lobjet dans la frame et mise à jour de la frame */ /* Ajout de lobjet dans la frame et mise à jour de la frame */
frame.add(page); // frame.add(page);
frame.validate(); frame.validate();
} }
} }