web-dev-qa-db-ja.com

pdfboxを使用してpdfから画像を抽出する

私はpdfboxを使用してpdfから画像を抽出しようとしています。 PDFの例 ここ

しかし、私は空白の画像のみを取得しています。

私が試しているコード:-

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 ++;
            }
        }
    }

}

ありがとう

27

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;
}
22
Matt

以下のGetImagesFromPDF Javaクラスはすべてのイメージを 4-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();
    }
}

}

10
pudaykiran

PDFBox 2.0.1では、一部の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);
            }
        }
    }
}
7
PerseusBC

パスの最後に.jpegを追加するだけです:

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

それは私のために働く。

2
Jorge

PDFページをBufferedImageに変換できるPDPage.convertToImage()関数を使用できます。次に、BufferedImageを使用してイメージを作成できます。

詳細については、次のリファレンスを使用してください。

  • すべてPDF取得できるPDFBoxの実現クラス Apache PDFBox 1.8.3 API
  • ここ PDPage関連のドキュメントを見ることができます。

そして、PDPageクラスでPDPage.convertToImage()関数を探すことを忘れないでください。

2
Abhay Pai

呼び出す代わりに

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

ImageIO.write() staticメソッドを使用して、必要な形式でRGBイメージを書き出すことができます。ここでは、PNGを使用しました。

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