2009-02-15 96 views
8

我需要将任意PDF文档的页面导出为jpeg/png/etc格式的一系列单独图像。我需要用Java来做到这一点。将PDF页导出到Java中的一系列图像

虽然我不知道iText的,PDFBox的和各种其他的Java PDF库,我希望为一个指向某个工作,或者是一些-如何。

谢谢。

回答

18

下面是一种方法来完成它,结合了来自网络的一些代码片段。

如何在图像中绘制PDF?

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

从图像

ORIGINAL建立一个缓冲图像:http://www.exampledepot.com/egs/java.awt.image/Image2Buf.html

更新:How to convert buffered image to image and vice-versa?

保存生成的图形为PNG或JPEG文件

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

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

结合成一些作品像这样把所有的页面转换成图片:

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

这正是我正在寻找的,谢谢! – dasp 2009-02-15 14:48:11

-1

与eample源文件刚开始你从1而不是0环您的问题将得到解决。

1

如果您发现太阳渲染器不工作的所有PDF文档,你可以考虑使用jPDFImages。

为了提高效率,您应该将每个PDF页面转换为缓冲图像,然后将其转换为您需要的各种图像格式。这将避免必须从PDF转换为每种格式的图像。

下面是使用jPDFImages从PDF转换为缓冲图像的链接: http://kbdeveloper.qoppa.com/jpdfimages/codesampleconvertpdfpageintobufferedimageinjava

对于每一个页面图像,你可以简单地出口到不同的图像格式: ImageIO.write(pageBufferedImage,“JPEG”,OUTPUTFILE) ; ImageIO.write(pageBufferedImage,“PNG”,outputFile); 等等

0

有不同的库来做到这一点。我已经通过PDFBox实现了这一点。但在我看来,最有效的解决方案是使用ghostscript。但是如果您认为您需要简单的解决方案,请使用ImageMagick。但ImageMagick内部调用ghostscript。使用ghostscript或imagemagick为您提供更好的解决方案。它比任何其他库要快得多。