2012-01-02 34 views
21

Tôi cố gắng trích xuất hình ảnh từ pdf bằng cách sử dụng pdfbox. Ví dụ pdf heretrích xuất hình ảnh từ pdf bằng cách sử dụng pdfbox

Nhưng tôi chỉ nhận được hình ảnh trống.

Mã i đang cố gắng: -

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

} 

Cảm ơn

+0

Tôi gặp sự cố khi kiểm tra mã của bạn: "UnsupportedOper" –

+0

Bạn có thấy câu trả lời về cách giải mã hình ảnh JBIG2 không? – MyTitle

+0

liên kết tới PDF đã chết –

Trả lời

0

PDF bao gồm hình ảnh JBIG2 mã hóa. Tôi không chắc liệu pdfBox có hỗ trợ chúng hay không.

+0

tôi có thể sử dụng thư viện jbig2-imageio: http://code.google.com/p/jbig2-imageio/wiki/Usage với ứng dụng này không? Sẽ thêm nó vào ứng dụng như là thư viện jar hoặc classpath làm việc? –

+0

@PradyutBhattacharya bạn đã tìm thấy giải pháp làm thế nào để giải mã hình ảnh JBIG2 bằng cách sử dụng 'jbig2-imageio'? cảm ơn – MyTitle

2

Chỉ cần thêm .jpeg đến cuối con đường của bạn:

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

đó làm việc cho tôi.

3

Bạn có thể sử dụng chức năng PDPage.convertToImage() có thể chuyển đổi trang PDF thành BufferedImage. Tiếp theo, bạn có thể sử dụng BufferedImage để tạo một hình ảnh.

Sử dụng các tài liệu tham khảo sau đây để xem chi tiết thêm:

  • Tất cả PDF lớp realated trong PDFBox bạn có thể nhận được trong Apache PDFBox 1.8.3 API
  • Here bạn có thể thấy PDPage tài liệu liên quan.

Và đừng quên tìm kiếm chức năng PDPage.convertToImage() trong lớp PDPage.

+0

làm thế nào nó liên quan đến câu hỏi .... –

0

Thay vì gọi

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

Bạn có thể sử dụng phương pháp ImageIO.write() tĩnh để viết hình ảnh RGB ra trong bất cứ định dạng mà bạn cần. Ở đây tôi đã sử dụng PNG:

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

dưới đây GetImagesFromPDF lớp java nhận được tất cả hình ảnh trong 04-Request-Headers.pdf tập tin và lưu các tập tin vào thư mục đích 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

là có một cách để sắp xếp này hoặc để chắc chắn rằng nó được thực hiện serially? – Ian

+0

@ Bạn có muốn nhận hình ảnh theo thứ tự nối tiếp không. – pudaykiran

+0

vâng tôi chỉ làm một loại trong danh sách và nó hoạt động. – Ian

7

Đối PDFBox 2.0.1, câu trả lời của pudaykiran phải được sửa đổi một chút vì một số API đã được thay đổi.

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

Tuyệt vời! Làm việc cho tôi. Nhưng trong cese của tôi với một addinion jai-imageio-jpeg2000 phụ thuộc để chuyển đổi hình ảnh jpeg2000. –

11

Đây là mã sử dụng PDFBox 2.0.1 sẽ có danh sách tất cả hình ảnh từ PDF. Điều này khác với mã khác ở chỗ nó sẽ xem xét lại tài liệu thay vì cố gắng lấy các hình ảnh từ cấp cao nhất.

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; 
} 
Các vấn đề liên quan