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 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();
}
}
/**
+35 -17
View File
@@ -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");
}
/**
+15 -44
View File
@@ -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 lafficher 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 nas 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 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();
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 dimage
* @param img
* @param scale
* @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);
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));
}
/**
+2 -2
View File
@@ -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
}
}
+2 -2
View File
@@ -25,10 +25,10 @@ class PageTest {
/* Creation de lobjet 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 lobjet dans la frame et mise à jour de la frame */
frame.add(page);
// frame.add(page);
frame.validate();
}
}