使用pdfbox从PDF中提取图像

问题描述:

我试图使用pdfbox从PDF中提取图像。这个例子pdf here使用pdfbox从PDF中提取图像

但我得到空白图像只。

I M试图代码: -

public static void main(String[] args) { 
    PDFImageExtract obj = new PDFImageExtract(); 
    try { 
     obj.read_pdf(); 
    } catch (IOException ex) { 
     System.out.println("" + ex); 
    } 

} 

void read_pdf() throws IOException { 
    PDDocument document = null; 
    try { 
     document = PDDocument.load("C:\\Users\\Pradyut\\Documents\\MCS-034.pdf"); 
    } catch (IOException ex) { 
     System.out.println("" + ex); 
    } 
    List pages = document.getDocumentCatalog().getAllPages(); 
    Iterator iter = pages.iterator(); 
    int i =1; 
    String name = null; 

    while (iter.hasNext()) { 
     PDPage page = (PDPage) iter.next(); 
     PDResources resources = page.getResources(); 
     Map pageImages = resources.getImages(); 
     if (pageImages != null) { 
      Iterator imageIter = pageImages.keySet().iterator(); 
      while (imageIter.hasNext()) { 
       String key = (String) imageIter.next(); 
       PDXObjectImage image = (PDXObjectImage) pageImages.get(key); 
       image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i); 
       i ++; 
      } 
     } 
    } 

} 

感谢

+0

我有问题,当测试代码:“UnsupportedOper” – 2012-02-14 18:08:22

+0

你找到答案如何JBIG2图像解码? – MyTitle 2012-08-23 06:05:19

+0

链接到PDF已死 – 2015-12-30 17:07:46

的PDF包含JBIG2编码的图像。我不确定pdfBox是否支持这些。

+0

我可以使用库jbig2-imageio:http://code.google.com/p/jbig2-imageio/wiki/Usage这个应用程序吗?将它添加到应用程序中作为库jar或classpath工作? – 2012-01-03 13:13:56

+0

@PradyutBhattacharya您是否发现了解决方案如何使用'jbig2-imageio'解码JBIG2图像?谢谢 – MyTitle 2012-08-27 10:48:51

只需添加.jpeg到您的路径的末尾:

image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i + ".jpeg"); 

这对我的作品。

您可以使用PDPage.convertToImage()函数,它可以将PDF页面转换为BufferedImage。接下来,您可以使用BufferedImage创建图像。

使用下面的参考进一步的细节:在PDFBox的

并且不要忘记在PDPa​​ge类中寻找PDPage.convertToImage()函数。

+0

它是如何涉及到的问题.... – 2016-03-16 14:23:36

与其说

image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i); 

可以使用ImageIO.write()静态方法写的RGB图像出任何你需要的格式。在这里,我使用PNG:

File outputFile = new File("C:\\Users\\Pradyut\\Documents\\image" + i + ".png"); 
ImageIO.write(image.getRGBImage(), "png", outputFile); 

以下GetImagesFromPDF Java类获得所有图像04-Request-Headers.pdf文件,这些文件保存到目标文件夹PDFCopy

import java.io.File; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDResources; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 

@SuppressWarnings({ "unchecked", "rawtypes", "deprecation" }) 
public class GetImagesFromPDF { 
    public static void main(String[] args) { 
     try { 
      String sourceDir = "C:/PDFCopy/04-Request-Headers.pdf";// Paste pdf files in PDFCopy folder to read 
      String destinationDir = "C:/PDFCopy/"; 
      File oldFile = new File(sourceDir); 
      if (oldFile.exists()) { 
      PDDocument document = PDDocument.load(sourceDir); 

      List<PDPage> list = document.getDocumentCatalog().getAllPages(); 

      String fileName = oldFile.getName().replace(".pdf", "_cover"); 
      int totalImages = 1; 
      for (PDPage page : list) { 
       PDResources pdResources = page.getResources(); 

       Map pageImages = pdResources.getImages(); 
       if (pageImages != null) { 

        Iterator imageIter = pageImages.keySet().iterator(); 
        while (imageIter.hasNext()) { 
         String key = (String) imageIter.next(); 
         PDXObjectImage pdxObjectImage = (PDXObjectImage) pageImages.get(key); 
         pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages); 
         totalImages++; 
        } 
       } 
      } 
     } else { 
      System.err.println("File not exists"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

+0

有没有办法对此进行排序或确保它是连续完成的? – Ian 2016-03-17 19:27:53

+0

@你是否想要按照连续顺序获取图像? – pudaykiran 2016-03-22 10:38:22

+0

是的,我只是在列表上做了一个排序,它的工作。 – Ian 2016-03-22 16:04:40

对于PDFBox的2.0.1,pudaykiran的回答必须稍加修改,因为一些API已被更改。

public static void testPDFBoxExtractImages() throws Exception { 
    PDDocument document = PDDocument.load(new File("D:/Temp/Test.pdf")); 
    PDPageTree list = document.getPages(); 
    for (PDPage page : list) { 
     PDResources pdResources = page.getResources(); 
     for (COSName c : pdResources.getXObjectNames()) { 
      PDXObject o = pdResources.getXObject(c); 
      if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) { 
       File file = new File("D:/Temp/" + System.nanoTime() + ".png"); 
       ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject)o).getImage(), "png", file); 
      } 
     } 
    } 
} 
+0

太棒了!适用于我。但在我用jai-imageio-jpeg2000依赖的插件来转换jpeg2000图像。 – 2017-12-27 09:54:19

这里是使用PDFBox 2.0.1的代码,它将得到PDF中所有图像的列表。这与其他代码不同之处在于它会递归通过文档而不是尝试从顶层获取图像。

public List<RenderedImage> getImagesFromPDF(PDDocument document) throws IOException { 
     List<RenderedImage> images = new ArrayList<>(); 
    for (PDPage page : document.getPages()) { 
     images.addAll(getImagesFromResources(page.getResources())); 
    } 

    return images; 
} 

private List<RenderedImage> getImagesFromResources(PDResources resources) throws IOException { 
    List<RenderedImage> images = new ArrayList<>(); 

    for (COSName xObjectName : resources.getXObjectNames()) { 
     PDXObject xObject = resources.getXObject(xObjectName); 

     if (xObject instanceof PDFormXObject) { 
      images.addAll(getImagesFromResources(((PDFormXObject) xObject).getResources())); 
     } else if (xObject instanceof PDImageXObject) { 
      images.add(((PDImageXObject) xObject).getImage()); 
     } 
    } 

    return images; 
}