2011-08-10 5 views
9

PDF 파일에서 이미지를 추출하려고합니다.올바른 순서로 iText를 사용하여 PDF에서 이미지를 추출하는 방법은 무엇입니까?

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(); 
     } 
    } 

나는 모든 이미지를 주었지만 이미지의 순서가 잘못되었습니다. 나의 다음 시도는이처럼 보였다 :

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 
} 

비록 o.isStream() == 사실, 내가에만 얻을/길이 및/필터 스트림 약 100 바이트입니다. 이미지를 찾을 수 없습니다.

제 질문은 올바른 순서로 PDF 파일의 모든 이미지를 얻는 것이 올바른 방법 일 것입니다.

답변

5

나는 iText 메일 링리스트와 같은 다른 곳에서 답을 찾았습니다.

다음 코드

나를 위해 작동합니다

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

도이 iText의 PDXObjectImage 부분인가? –

+4

@FilipeCorreia nratx가 Apache PDFBox로 전환 한 것을 잊어 버렸습니다. – matt

+0

일부 PDF 파일의 경우'PDResources resources = page.getResources();'행을'PDResources resources = page.findResources(); '로 바꿔야합니다. – Tim

관련 문제