2011-08-10 68 views
9

Estoy tratando de extraer imágenes de un archivo PDF. He encontrado un ejemplo en la web, que funcionó bien:¿Cómo extraer imágenes de un PDF con iText en el orden correcto?

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

Eso me dio todas las imágenes, pero las imágenes fueron en el orden equivocado. Mi siguiente intento se veía así:

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 
} 

Aunque o.isStream() == true, solo me dan/Longitud y/filtro y la corriente es de sólo 100 bytes de longitud. No se encuentra ninguna imagen en absoluto.

Mi pregunta sería cuál sería la forma correcta de obtener todas las imágenes de un archivo PDF en el orden correcto.

Respuesta

5

Encontré una respuesta en otro lugar, a saber, la lista de correo iText.

El siguiente código funciona para mí:

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

Es parte PDXObjectImage de iText también? parece que no puede encontrarlo –

+4

@FilipeCorreia nratx olvidó mencionar que cambió a Apache PDFBox. – matt

+0

Para algunos archivos PDF, la línea 'PDResources resources = page.getResources();' deberá reemplazarse por 'PDResources resources = page.findResources();' – Tim

Cuestiones relacionadas