2009-02-15 9 views
8

Ho bisogno di esportare le pagine di un documento PDF arbitrario in una serie di singole immagini in formato jpeg/png/etc. Ho bisogno di farlo in Java.Esporta pagine PDF in una serie di immagini in Java

Sebbene conosca iText, PDFBox e varie altre librerie java pdf, spero di puntare a qualche esempio di lavoro o ad alcuni suggerimenti.

Grazie.

risposta

18

Ecco un modo per farlo, combinando alcuni frammenti di codice da tutto il web.

Come si disegna un PDF in un'immagine?

https://pdf-renderer.dev.java.net/examples.html

Creazione di un'immagine tamponata da un'immagine

ORIGINALE: http://www.exampledepot.com/egs/java.awt.image/Image2Buf.html

AGGIORNAMENTO: How to convert buffered image to image and vice-versa?

Salvataggio di un grafico generato per un PNG o JPEG

ORIGINALE: http://www.exampledepot.com/egs/javax.imageio/Graphic2File.html

AGGIORNAMENTO: http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html

combinato insieme in qualcosa che funziona in questo modo per girare tutte le pagine in immagini:

import com.sun.pdfview.PDFFile; 
import com.sun.pdfview.PDFPage; 

import java.awt.Graphics; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.HeadlessException; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.Transparency; 
import java.io.*; 
import java.nio.ByteBuffer; 
import java.nio.channels.FileChannel; 
import javax.swing.*; 
import javax.imageio.*; 
import java.awt.image.*; 

public class ImageMain { 
    public static void setup() throws IOException { 
     // load a pdf from a byte buffer 
     File file = new File("test.pdf"); 
     RandomAccessFile raf = new RandomAccessFile(file, "r"); 
     FileChannel channel = raf.getChannel(); 
     ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); 
     PDFFile pdffile = new PDFFile(buf); 
     int numPgs = pdffile.getNumPages(); 
     for (int i = 0; i < numPgs; i++) { 
      // draw the first page to an image 
      PDFPage page = pdffile.getPage(i); 
      // get the width and height for the doc at the default zoom 
      Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight()); 
      // generate the image 
      Image img = page.getImage(rect.width, rect.height, // width & height 
        rect, // clip rect 
        null, // null for the ImageObserver 
        true, // fill background with white 
        true // block until drawing is done 
        ); 
      // save it as a file 
      BufferedImage bImg = toBufferedImage(img); 
      File yourImageFile = new File("page_" + i + ".png"); 
      ImageIO.write(bImg, "png", yourImageFile); 
     } 
    } 

    // This method returns a buffered image with the contents of an image 
    public static BufferedImage toBufferedImage(Image image) { 
     if (image instanceof BufferedImage) { 
      return (BufferedImage) image; 
     } 
     // This code ensures that all the pixels in the image are loaded 
     image = new ImageIcon(image).getImage(); 
     // Determine if the image has transparent pixels; for this method's 
     // implementation, see e661 Determining If an Image Has Transparent 
     // Pixels 
     boolean hasAlpha = hasAlpha(image); 
     // Create a buffered image with a format that's compatible with the 
     // screen 
     BufferedImage bimage = null; 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     try { 
      // Determine the type of transparency of the new buffered image 
      int transparency = Transparency.OPAQUE; 
      if (hasAlpha) { 
       transparency = Transparency.BITMASK; 
      } 
      // Create the buffered image 
      GraphicsDevice gs = ge.getDefaultScreenDevice(); 
      GraphicsConfiguration gc = gs.getDefaultConfiguration(); 
      bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency); 
     } catch (HeadlessException e) { 
      // The system does not have a screen 
     } 
     if (bimage == null) { 
      // Create a buffered image using the default color model 
      int type = BufferedImage.TYPE_INT_RGB; 
      if (hasAlpha) { 
       type = BufferedImage.TYPE_INT_ARGB; 
      } 
      bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); 
     } 
     // Copy image to buffered image 
     Graphics g = bimage.createGraphics(); 
     // Paint the image onto the buffered image 
     g.drawImage(image, 0, 0, null); 
     g.dispose(); 
     return bimage; 
    } 

    public static boolean hasAlpha(Image image) { 
     // If buffered image, the color model is readily available 
     if (image instanceof BufferedImage) { 
      BufferedImage bimage = (BufferedImage) image; 
      return bimage.getColorModel().hasAlpha(); 
     } 
     // Use a pixel grabber to retrieve the image's color model; 
     // grabbing a single pixel is usually sufficient 
     PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); 
     try { 
      pg.grabPixels(); 
     } catch (InterruptedException e) { 
     } 
     // Get the image's color model 
     ColorModel cm = pg.getColorModel(); 
     return cm.hasAlpha(); 
    } 

    public static void main(final String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        ImageMain.setup(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
+0

Questo è esattamente quello che stavo cercando, grazie! – dasp

+0

il metodo hasAlpha perso può essere trovato qui http://www.biddata.net/joel/photo/final/Photo.java – zaletniy

+0

@jedierikb Ho modificato il link a pdf-renderer perché non funzionava più, ma potevo non trovare una pagina con gli esempi. Forse sai dove si è trasferito. –

-1

Basta avviare il ciclo for da 1 anziché 0. Il problema verrà risolto.

1

Se si scopre che il renderizzatore solare non funziona per tutti i documenti PDF, è possibile utilizzare jPDFImages.

Per essere più efficiente, è necessario convertire ciascuna pagina PDF in un'immagine bufferizzata e da lì convertire i vari formati di immagine necessari. Ciò eviterebbe di dover convertire da PDF a immagini per ogni formato.

Ecco il link per la conversione da PDF in immagini memorizzate utilizzando jPDFImages: http://kbdeveloper.qoppa.com/jpdfimages/codesampleconvertpdfpageintobufferedimageinjava

Per ciascuna pagina si può semplicemente esportare in diversi formati di immagine: ImageIO.write (pageBufferedImage, "JPEG", fileOutput) ; ImageIO.write (pageBufferedImage, "PNG", outputFile); ecc ...

0

Ci sono diverse librerie per farlo. Ho raggiunto questo con PDFBox. Ma a mio parere la soluzione più efficiente è usare ghostscript. Ma se pensi di aver bisogno di una soluzione facile, usa ImageMagick. Ma ImageMagick chiama internamente il ghostscript. Usando ghostscript o imagemagick ti offriamo una soluzione migliore. È molto più veloce di qualsiasi altra libreria.