2011-08-10 44 views
9

Tôi đang cố gắng trích xuất hình ảnh từ một tệp PDF. Tôi đã tìm thấy ví dụ trên web, hoạt động tốt:Làm cách nào để trích xuất hình ảnh từ PDF bằng iText theo đúng thứ tự?

PdfReader reader; 

    File file = new File("example.pdf"); 
    reader = new PdfReader(file.getAbsolutePath()); 
    for (int i = 0; i < reader.getXrefSize(); i++) { 
     PdfObject pdfobj = reader.getPdfObject(i); 
     if (pdfobj == null || !pdfobj.isStream()) { 
      continue; 
     } 
     PdfStream stream = (PdfStream) pdfobj; 
     PdfObject pdfsubtype = stream.get(PdfName.SUBTYPE); 
     if (pdfsubtype != null && pdfsubtype.toString().equals(PdfName.IMAGE.toString())) { 
      byte[] img = PdfReader.getStreamBytesRaw((PRStream) stream); 
      FileOutputStream out = new FileOutputStream(new File(file.getParentFile(), String.format("%1$05d", i) + ".jpg")); 
      out.write(img); 
      out.flush(); 
      out.close(); 
     } 
    } 

Điều đó đã cho tôi tất cả hình ảnh nhưng hình ảnh sai thứ tự. Lần thử tiếp theo của tôi trông giống như sau:

for (int i = 0; i <= reader.getNumberOfPages(); i++) { 
    PdfDictionary d = reader.getPageN(i); 
    PdfIndirectReference ir = d.getAsIndirectObject(PdfName.CONTENTS); 
    PdfObject o = reader.getPdfObject(ir.getNumber()); 
    PdfStream stream = (PdfStream) o; 
    // rest from example above 
} 

Mặc dù o.isStream() == true, tôi chỉ nhận/Độ dài và/Bộ lọc và luồng chỉ dài khoảng 100 byte. Không tìm thấy hình ảnh nào cả.

Câu hỏi của tôi sẽ là cách chính xác để có được tất cả hình ảnh từ tệp PDF theo đúng thứ tự.

Trả lời

5

Tôi tìm thấy câu trả lời ở nơi khác, cụ thể là danh sách gửi thư iText.

Các mã sau đây làm việc cho tôi:

PDDocument document = null; 
document = PDDocument.load(inFile); 
List pages = document.getDocumentCatalog().getAllPages(); 
Iterator iter = pages.iterator(); 
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.write2OutputStream(/* some output stream */); 
       } 
      } 
} 
+0

Là một phần của PDXObjectImage iText quá? dường như không thể tìm thấy nó –

+4

@FilipeCorreia nratx quên đề cập đến rằng anh đã chuyển sang Apache PDFBox. – matt

+0

Đối với một số tệp PDF, dòng 'PDResources resources = page.getResources(); 'sẽ cần phải được thay thế bằng' PDResources resources = page.findResources();' – Tim

Các vấn đề liên quan