Zaloguj się
Projekty Kategorie Archiwum

Parę dni temu ujawniono wielki sekret(tm). Chodzi nową i darmową (licencja LGPL) bibliotekę służącą do renderowania plików PDF - PDF Renderer. Pomimo tego, że sama biblioteka jest jeszcze w dość wczesnej (?) fazie rozwoju, to działa bardzo dobrze i szybko ;)

Więc jak użyć to API, żeby wyświetlić plik PDF w Swingu?

Podstawowe klasy, które użyjemy w naszym przykładzie to:

  • com.sun.pdfview.PDFFile - reprezentuje plik PDF
  • com.sun.pdfview.PDFPage - reprezentuje pojedynczą stronę w pliku PDF
  • com.sun.pdfview.PagePanel - komponent w którym wyświetlana jest strona

Najpierw otwieramy plik PDF. OK, na razie API nie jest najładniejsze, ale pewnie wkrótce to poprawią ;)

RandomAccessFile raf = new RandomAccessFile("jakiśplik.pdf", "r");
FileChannel fc = raf.getChannel();
file = new PDFFile(fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()));
Po otwarciu pliku można wczytać np. 1 stronę:
PDFPage page = file.getPage(1);
panel.showPage(page);

Kompletny program

  • Kompilacja: javac -cp PDFRenderer.jar:. PDF.java
  • Uruchomienie: java -cp PDFRenderer.jar:. PDF jakiśplik.pdf
  • Plik PDFRenderer.jar jest na stronie PDF Renderer
  • Spacja - następna strona, Backspace - poprzednia, Z - zoom po zaznaczeniu myszą

import com.sun.pdfview.*;
import java.awt.event.*;
import java.io.*;
import java.nio.channels.FileChannel;
import javax.swing.*;
public class PDF extends JFrame {

	boolean zoom;
	int currentPage = 1;
	PagePanel panel;
	PDFFile file;

	PDF(String[] args) {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(800, 600);
		setLocationRelativeTo(null); // center on screen

		panel = new PagePanel();
		panel.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				switch (e.getKeyCode()) {
					case KeyEvent.VK_SPACE:
						navigate(currentPage + 1);
						break;
					case KeyEvent.VK_BACK_SPACE:
						navigate(currentPage - 1);
						break;
					case KeyEvent.VK_Z:
						zoom = !zoom;
						panel.useZoomTool(zoom);
						if (!zoom)
							panel.setClip(null);
						break;
				}
			}
		} );
		add(panel);
		setVisible(true);

		try {
			RandomAccessFile raf = new RandomAccessFile(args[0], "r");
			FileChannel fc = raf.getChannel();
			file = new PDFFile(fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()));
			navigate(1);
		}
		catch (IOException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(this, "Error: " + e.getMessage());
		}
	}

	void navigate(int pageNumber) {
		if (pageNumber < 1 || pageNumber > file.getNumPages())
			return;

		PDFPage page = file.getPage(pageNumber);
		panel.showPage(page);
		currentPage = pageNumber;
		setTitle(currentPage + "/" + file.getNumPages());
	}

	public static void main(final String[] args) {
		if (args.length != 1) {
			JOptionPane.showMessageDialog(null, "Usage: PDF ");
			return;
		}
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new PDF(args);
			}
		} );
	}

}

PS. Na stronie projektu można również uruchomić dużo bardziej funkcjonalne "viewer demo".

Proszę o komentarz

Sobota 15 grudnia, 2007 16:53

Zajebioza. Może skonwertują to na C#, to wtedy użyję to w swoim projekcie.

abrams
Czwartek 2 kwietnia, 2009 13:17

Problem się pojawia jak okno JDialog jest modalne – PagePanel przestaje działać ...

ex1
Sobota 4 lipca, 2009 17:57

fajne, ale ja potrzebuje by dalo sie zaznaczac tekst, zeby stwierdzic czy pdf jest OCRowany czy nie. Do tego lepsza jest biblioteka jPedal, choc jest troche kaprysna

Dj_k2
Poniedziałek 22 marca, 2010 15:02

Osobiście użyłem tej biblioteki do Oracle Forms 10g jako Beana Javovego. Zamieszczony program bardzo się przydał i działa naprawdę nice. Jeśli chodzi o używanie jPedal to są z tą biblioteką spore problemy. Próbowałem na początku zaimplementować mojego beana właśnie z wykorzystaniem jPedal i owa bibliotego nie potrafiła poradzić sobie z polskimi czcionkami w plikach PDF co gorsza dla PDF'ów bez zagnieżdżonych fontów nie działało wcale. Pozdrawiam

Napisz komentarz

Dodaj komentarz

Formatowanie komentarza

Kategorie

Ewolucja Internetu 8 | Fail 40 | Gry 46 | Humor 129 | Idiotyzm 50 | Java 110 | KDE 85 | KShutDown 22 | Linux 84 | Makagiga 58 Muzeum 3 | Ogólne 819 | Polityka 76 | Programowanie 51 | Reklamy 4 | Techblog 19 | Teorie Spiskowe 12 | TV 59 | UI 9 | Użyteczność 30 | WWW 90 | Wyrwane z Kontekstu 34 | X Files 14

Archiwum

Maj 2012 | Kwiecień 2012 | Marzec 2012 | Luty 2012 | Styczeń 2012 | Grudzień 2011 | Listopad 2011 | Październik 2011 | Wrzesień 2011 | Sierpień 2011 | Lipiec 2011 | Czerwiec 2011 | Maj 2011 | Kwiecień 2011 | Styczeń 2011 | Listopad 2010 | Październik 2010 | Wrzesień 2010 | Sierpień 2010 | Lipiec 2010 | Czerwiec 2010 | Kwiecień 2010 | Marzec 2010 | Luty 2010 | Styczeń 2010 | Grudzień 2009 | Listopad 2009 | Październik 2009 | Wrzesień 2009 | Sierpień 2009 | Lipiec 2009 | Czerwiec 2009 | Maj 2009 | Kwiecień 2009 | Marzec 2009 | Styczeń 2009 | Grudzień 2008 | Listopad 2008 | Październik 2008 | Wrzesień 2008 | Sierpień 2008 | Lipiec 2008 | Czerwiec 2008 | Maj 2008 | Kwiecień 2008 | Marzec 2008 | Luty 2008 | Styczeń 2008 | Grudzień 2007 | Listopad 2007 | Październik 2007 | Wrzesień 2007 | Sierpień 2007 | Lipiec 2007 | Czerwiec 2007 | Maj 2007 | Kwiecień 2007 | Marzec 2007 | Luty 2007 | Styczeń 2007 | Grudzień 2006 | Listopad 2006 | Październik 2006 | Wrzesień 2006 | Sierpień 2006 | Lipiec 2006 | Czerwiec 2006 | Maj 2006 | Kwiecień 2006 | Marzec 2006 | Luty 2006 | Styczeń 2006 | Grudzień 2005 | Listopad 2005 | Październik 2005 | Wrzesień 2005 | Sierpień 2005 | Lipiec 2005 | Czerwiec 2005 | Maj 2005 | Kwiecień 2005 | Marzec 2005 | Luty 2005 | Styczeń 2005