2009-02-15 7 views
8

J'ai besoin d'exporter les pages d'un document PDF arbitraire dans une série d'images individuelles au format jpeg/png/etc. Je dois le faire en Java.Exporter des pages PDF vers une série d'images en Java

Bien que je sache sur iText, PDFBox et diverses autres bibliothèques pdf java, j'espère un pointeur vers un exemple de travail, ou un peu comment.

Merci.

Répondre

18

Voici une façon de le faire, en combinant des fragments de code provenant du Web.

Comment dessiner un PDF dans une image?

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

Création d'une image Buffered à partir d'une image

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

MISE À JOUR: How to convert buffered image to image and vice-versa?

Enregistrement produit un graphique dans un fichier PNG ou JPEG

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

MISE À JOUR: http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html

combinés en quelque chose qui fonctionne comme celui-ci pour tourner toutes les pages en images:

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

C'est exactement ce que je cherchais, merci! – dasp

+0

la méthode hasAlpha manqué peut être trouvé ici http://www.biddata.net/joel/photo/final/Photo.java – zaletniy

+0

@jedierikb J'ai édité le lien vers pdf-rendu car il ne fonctionnait plus, mais je pouvais pas trouver une page avec les exemples. Peut-être que vous savez où il a déménagé. –

-1

Commencez juste votre boucle for de 1 au lieu de 0. Votre problème sera résolu.

1

Si vous trouvez que le moteur de rendu solaire ne fonctionne pas pour tous vos documents PDF, vous pouvez utiliser jPDFImages. Pour être plus efficace, vous devez convertir chaque page PDF en une image mise en mémoire tampon et, à partir de là, convertir vers les différents formats d'image dont vous avez besoin. Cela évite d'avoir à convertir des PDF en images pour chaque format.

Voici le lien pour convertir PDF en images mises en mémoire tampon en utilisant jPDFImages: http://kbdeveloper.qoppa.com/jpdfimages/codesampleconvertpdfpageintobufferedimageinjava

Pour chaque page, vous pouvez simplement exporter vers différents formats d'image: ImageIO.write (pageBufferedImage, "JPEG", outputFile) ; ImageIO.write (pageBufferedImage, "PNG", outputFile); etc ...

0

Il existe différentes bibliothèques pour le faire. Je l'ai réalisé avec PDFBox. Mais à mon avis, la solution la plus efficace consiste à utiliser ghostscript. Mais si vous pensez avoir besoin d'une solution facile, utilisez ImageMagick. Mais ImageMagick appelle en interne le ghostscript. Utiliser ghostscript ou imagemagick vous donne une meilleure solution. C'est beaucoup plus rapide que n'importe quelle autre bibliothèque.

Questions connexes