/* Copyright (C) 2012 Meltem Meltem Demirköprü, Ahmad Hammoud, Oliver Kopp This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.jabref; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import net.sf.jabref.gui.FileListEntry; import net.sf.jabref.gui.FileListTableModel; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; public class PdfPreviewPanel extends JPanel { private PDDocument document = null; private JLabel picLabel; private final MetaData metaData; public PdfPreviewPanel(MetaData metaData) { this.metaData = metaData; picLabel = new JLabel(); add(picLabel); } private void renderPDFFile(File file) { InputStream input; try { input = new FileInputStream(file); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } try { document = PDDocument.load(input); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } @SuppressWarnings("unchecked") List<PDPage> pages = document.getDocumentCatalog().getAllPages(); PDPage page = pages.get(0); BufferedImage image = null; try { image = page.convertToImage(); } catch (Exception e1) { // silently ignores all rendering exceptions image = null; } if (image != null) { int width = this.getParent().getWidth(); int height = this.getParent().getHeight(); BufferedImage resImage = resizeImage(image, width, height, BufferedImage.TYPE_INT_RGB); ImageIcon icon = new ImageIcon(resImage); picLabel.setText(null); picLabel.setIcon(icon); } else { clearPreview(); } try { document.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private BufferedImage resizeImage(BufferedImage originalImage, int width, int height, int type) { int h = originalImage.getHeight(); int w = originalImage.getWidth(); if ((height == 0) || (width == 0)) { height = h; width = w; } else { float factorH = (float) height / (float) h; float factorW = (float) width / (float) w; if (factorH < factorW) { // use factorH, only width has to be changed as height is // already correct width = Math.round(w * factorH); } else { width = Math.round(h * factorW); } } BufferedImage resizedImage = new BufferedImage(width, height, type); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, width, height, null); return resizedImage; } public void updatePanel (BibtexEntry entry) { if (entry == null) { clearPreview(); return; } picLabel.setText("rendering preview..."); picLabel.setIcon(null); FileListTableModel tm = new FileListTableModel(); tm.setContent(entry.getField("file")); FileListEntry flEntry = null; for (int i=0; i< tm.getRowCount(); i++) { flEntry = tm.getEntry(i); if (flEntry.getType().getName().toLowerCase().equals("pdf")) { break; } } if (flEntry != null) { File pdfFile = Util.expandFilename(metaData, flEntry.getLink()); if (pdfFile != null) { renderPDFFile(pdfFile); } else { clearPreview(); } } else { clearPreview(); } } private void clearPreview() { this.picLabel.setIcon(null); this.picLabel.setText(Globals.lang("no preview available")); } }