2012-01-02 138 views
21

我試圖使用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

回答

0

的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

2

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

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

這對我的作品。

3

您可以使用PDPage.convertToImage()函數,它可以將PDF頁面轉換爲BufferedImage。接下來,您可以使用BufferedImage創建圖像。

使用下面的參考進一步的細節:在PDFBox的

並且不要忘記在PDPa​​ge類中尋找PDPage.convertToImage()函數。

+0

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

0

與其說

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); 
11

以下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

7

對於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

11

這裏是使用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; 
}