2012-01-02 29 views
21

Estoy tratando de extraer imágenes de un pdf usando pdfbox. El ejemplo pdf hereextraer imágenes del pdf usando pdfbox

Pero solo recibo imágenes en blanco.

el código que estoy tratando: -

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

} 

Gracias

+0

tuve un problema cuando se prueba su código: "UnsupportedOper" –

+0

Foro encontró respuesta cómo decodificar imágenes JBIG2? – MyTitle

+0

el enlace a PDF está muerto –

Respuesta

0

El PDF se compone de imágenes JBIG2 codificado. No estoy seguro si pdfBox los admite.

+0

¿puedo usar la biblioteca jbig2-imageio: http://code.google.com/p/jbig2-imageio/wiki/Usage con esta aplicación? ¿Lo va a agregar a la aplicación como jar de biblioteca o classpath? –

+0

@PradyutBhattacharya ¿Has encontrado una solución para decodificar imágenes JBIG2 usando 'jbig2-imageio'? gracias – MyTitle

2

Sólo tiene que añadir la .jpeg hasta el final de su trayectoria:

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

que funciona para mí.

3

Puede usar la función PDPage.convertToImage() que puede convertir la página PDF en una Imagen Buffered. Luego puede usar la Imagen Buffered para crear una Imagen.

utilizar la siguiente referencia para más detalles:

  • Todo PDF clases Realated en PDFBox se puede obtener en Apache PDFBox 1.8.3 API
  • Here se puede ver la documentación relacionada PDPage.

Y no olvide buscar la función PDPage.convertToImage() en la clase PDPage.

+0

¿cómo se relaciona con la pregunta .... –

0

En lugar de llamar

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

Se puede utilizar el método estático ImageIO.write() para escribir la imagen RGB a cabo en el formato que necesita. Aquí he utilizado PNG:

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

La continuación GetImagesFromPDF clase java obtener todas las imágenes en 04-Request-Headers.pdf archivo y guardar los archivos en la carpeta de destino 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

¿hay alguna manera de ordenar esto o asegurarse de que se haga en serie? – Ian

+0

@Ian desea obtener imágenes en orden de serie. – pudaykiran

+0

Sí, acabo de hacer una especie en la lista y funcionó. – Ian

7

Para PDFBox 2.0.1, la respuesta de pudaykiran debe ser ligeramente modificados, ya que algunas APIs han cambiado.

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

¡Genial! Funciona para mi. Pero en mi caso con una adición de la dependencia jai-imageio-jpeg2000 para convertir imágenes jpeg2000. –

11

Aquí es código usando PDFBox 2.0.1 que va a obtener una lista de todas las imágenes de la PDF. Esto es diferente al otro código en el sentido de que recurrirá a través del documento en lugar de tratar de obtener las imágenes desde el nivel superior.

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; 
} 
Cuestiones relacionadas