Une entité pour visualiser un PDF

Aller en bas

Une entité pour visualiser un PDF Empty Une entité pour visualiser un PDF

Message  Gus le Mer 20 Avr - 11:56

Voici une entité graphique de type "éditeur de fichier" qui permet d'afficher un PDF et de parcourir ses pages.
gus.file.editor.pdf.editor1

Une entité pour visualiser un PDF Gusexplorer_afficher_pdf
Illustration de l'application "Gus Explorer" utilisant l'entité gus.file.editor.pdf.editor1

L'entité fait appel à un objet Map fournit par le gestionnaire de l'application pour mémoriser la page courante pour chaque pdf déjà chargé.
Par ailleurs, elle dépend des deux APIs : itext-1.4.6.jar et jpedal.jar

Voici le code source de l'entité :

Code:
package gus05.entity.gus.file.editor.pdf.editor1;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.Map;

import gus05.framework.core.Entity;
import gus05.framework.core.Outside;
import gus05.framework.features.Give;
import gus05.framework.features.Graphic;
import gus05.framework.features.Register;
import gus05.framework.tools.DefaultSupport;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.jpedal.Display;
import org.jpedal.PdfDecoder;

public class PdfEditor1 extends DefaultSupport implements Entity, Give, Graphic, Register, ChangeListener, MouseListener {


    public String getName()         {return "gus.file.editor.pdf.editor1";}
    public String getCreationDate()      {return "2006.10.27";}


    private JPanel panel;
    private JSlider slider;
    private JLabel numberLabel;
   
    private PdfDecoder decoder;
   
    private File file;
    private String filePath;
    private int pageCount;
    private int currentPage;
   
    private Map pagesMap;
   
    private boolean waiting_opening = false;
    private boolean waiting_decoding = false;
   
    private boolean during_opening = false;
    private boolean during_decoding = false;
   


    public PdfEditor1() throws Exception
    {
        pagesMap = (Map) Outside.resource(this,"pagesmap");
       
        decoder = new PdfDecoder();
        decoder.setDisplayView(Display.SINGLE_PAGE,Display.DISPLAY_CENTERED);
        decoder.addMouseListener(this);       
       
        slider = new JSlider(JSlider.VERTICAL);
        slider.setBorder(BorderFactory.createEmptyBorder(0,0,0,10));
        slider.setInverted(true);
        slider.setMinimum(0);
       
        slider.setMajorTickSpacing(50);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.addChangeListener(this);
       
        numberLabel = new JLabel(" ",SwingConstants.CENTER);
        numberLabel.setFont(numberLabel.getFont().deriveFont(Font.PLAIN));
       
        JPanel p = new JPanel(new BorderLayout());
        p.add(slider,BorderLayout.CENTER);
        p.add(numberLabel,BorderLayout.SOUTH);
       
        JScrollPane scroll = new JScrollPane(decoder);
        scroll.getVerticalScrollBar().setUnitIncrement(30);
       
        panel = new JPanel(new BorderLayout());
        panel.add(p,BorderLayout.WEST);
        panel.add(scroll,BorderLayout.CENTER);
    }


    public void give(Object obj) throws Exception
    {
        file = (File) obj;
        filePath = file.getAbsolutePath();
       
        if(waiting_opening)return;
        Thread t = new Thread(){public void run(){openPdfFile();}};
        t.start();
    }


    public JComponent gui()
    {return panel;}


    public void register(String key, Object obj) throws Exception
    {
        throw new Exception("Unknown key: "+key);
    }
   
   
    public void stateChanged(ChangeEvent e)
    {
        int index = slider.getValue();
        if(index==0) index=1;
        goToPage(index);
    }
   
   
    private void goToPage(int newPage)
    {
        if(newPage==currentPage) return;
        if(newPage>pageCount) return;
        if(newPage<1) return;
       
        currentPage = newPage;
        updateNumberLabel();
        updateSlider();
       
        pagesMap.put(filePath,""+currentPage);
        if(waiting_decoding)return;
        Thread t = new Thread(){public void run(){decodePage();}};
        t.start();
    }
   
   
    private void updateNumberLabel()
    {numberLabel.setText(" "+currentPage+" / "+pageCount+" ");}

   
    private void updateSlider()
    {
        slider.removeChangeListener(this);
        slider.setMaximum(pageCount);
        slider.setValue(currentPage);
        slider.addChangeListener(this);
    }
   
   
    private void openPdfFile()
    {
        waiting_opening = true;
       
        while(during_opening || during_decoding)
        {Thread.yield();}
       
        waiting_opening = false;
        during_opening = true;
       
        try
        {
            decoder.flushObjectValues(true);
            decoder.resetViewableArea();
            decoder.openPdfFile(filePath);
           
            pageCount = decoder.getPageCount();
            currentPage = findPdfPage();
            updateNumberLabel();
            updateSlider();
           
            decoder.decodePage(currentPage);
            decoder.setPageParameters((float)1.5,1);
            decoder.repaint();
        }
        catch(Exception e)
        {Outside.err(this,"openPdfFile()",e);}
        during_opening = false;
    }
   

    private void decodePage()
    {
        waiting_decoding = true;
       
        while(during_opening || during_decoding)
        {Thread.yield();}
       
        waiting_decoding = false;
        during_decoding = true;
       
        try
        {
            http://System.out.println("decode page "+currentPage);
            decoder.decodePage(currentPage);
            decoder.repaint();
        }
        catch(Exception e)
        {Outside.err(this,"decodePage()",e);}
        during_decoding = false;
    }
   

    private int findPdfPage()
    {
        if(!pagesMap.containsKey(filePath))
            pagesMap.put(filePath,"1");
        int n = Integer.parseInt((String) pagesMap.get(filePath));
        return n;
    }
   
   
    public void mouseClicked(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e)
    {
        if(e.getButton()==MouseEvent.BUTTON1) goToPage(currentPage+1);
        if(e.getButton()==MouseEvent.BUTTON3) goToPage(currentPage-1);
    }
    public void mouseReleased(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
   
}
Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum