2012-01-02 34 views
21

pdfを使用して画像をpdfから抽出しようとしています。例pdf herepdfを使用して画像を抽出する

しかし、私は空白の画像しか得ていません。

私がしようとして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は」 –

+0

あなたはJBIG2画像をデコードする方法を答えていますか? – MyTitle

+0

PDFへのリンクがありません –

答えて

0

PDFは、JBIG2エンコードされた画像から構成されています。私はpdfBoxがこれらをサポートしているかどうかはわかりません。

+0

私はライブラリjbig2-imageioを使用できますか:http://code.google.com/p/jbig2-imageio/wiki/このアプリケーションで使用しますか?ライブラリJARやクラスパスとしてアプリケーションに追加しますか? –

+0

@PradyutBhattacharyaあなたは 'jbig2-imageio'を使ってJBIG2イメージを解読する方法を見つけましたか?ありがとう – MyTitle

2

ちょうどあなたのパスの最後に.jpegを追加します。私の作品

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

を。

3

PDPage.convertToImage()機能を使用すると、PDFページをBufferedImageに変換できます。次に、BufferedImageを使用してイメージを作成します。あなたはPDPage関連のドキュメントを参照してくださいすることができます Apache PDFBox 1.8.3 API

  • Hereに取得することができますPDFBoxのすべてのPDF realatedクラス

    • は、さらに詳細については、以下を参照してください。

    PDPageクラスでPDPage.convertToImage()の機能を探すのを忘れないでください。

  • +0

    どのように質問に関連して.... –

    0

    の代わりにあなたは何が必要なフォーマットでRGB画像を書き出すためにImageIO.write()静的メソッドを使用することができます

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

    を呼び出します。ここで私は、PNGを使用しました:GetImagesFromPDF Javaクラス以下

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

    ザ・04-Request-Headers.pdfファイル内のすべての画像を取得し、保存先のフォルダPDFCopyにそれらのファイルを保存します。 PDFBox 2.0.1用

    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

    +0

    @Ianは、連続して画像を取得しますか? – pudaykiran

    +0

    ええ、私はちょうどリストの並べ替えをし、それは働いた。 – Ian

    7

    一部のAPIが変更されているため、pudaykiranの答えは、わずかに修正されなければなりません。

    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

    素晴らしい!私のために働く。しかしjpeg2000画像を変換するjai-imageio-jpeg2000依存性の追加がある私のceseでは。 –

    11

    PDFからすべての画像のリストを取得するPDFBox 2.0.1を使用するコードです。これは、トップレベルからイメージを取得しようとする代わりに、ドキュメントを介して繰り返される点で、他のコードとは異なります。

    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; 
    } 
    
    関連する問題