2011-08-10 33 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.findResources();' – Tim

相關問題