2012-01-02 17 views
21

Sto cercando di estrarre immagini da un pdf usando pdfbox. L'esempio pdf hereestrae le immagini da pdf usando pdfbox

Ma sto ricevendo solo immagini vuote.

il codice che sto cercando: -

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

} 

Grazie

+0

ho avuto problema quando prova il codice: "UnsupportedOper" –

+0

Avete trovato risposta come decodificare le immagini JBIG2? – MyTitle

+0

collegamento al PDF è morto –

risposta

0

Il PDF costituito da immagini JBIG2 codificato. Non sono sicuro che pdfBox supporti questi.

+0

posso usare la libreria jbig2-imageio: http://code.google.com/p/jbig2-imageio/wiki/Usage con questa applicazione? Lo aggiungerà all'applicazione come jar di libreria o percorso di classe? –

+0

@PradyutBhattacharya hai trovato la soluzione su come decodificare le immagini JBIG2 usando 'jbig2-imageio'? grazie – MyTitle

2

Basta aggiungere il .jpeg alla fine del percorso:

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

che funziona per me.

3

È possibile utilizzare la funzione PDPage.convertToImage() in grado di convertire la pagina PDF in un'immagine Buffered. Successivamente è possibile utilizzare BufferedImage per creare un'immagine.

Usare il seguente riferimento per ulteriori dettagli:

E non dimenticare di cercare la funzione PDPage.convertToImage() nella classe PDPage.

+0

come è correlato alla domanda .... –

0

Invece di chiamare

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

È possibile utilizzare il metodo statico ImageIO.write() per scrivere l'immagine RGB in qualunque formato che vi serve. Qui ho usato PNG:

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

Il sotto GetImagesFromPDF classe java ottenere tutte le immagini in 04-Request-Headers.pdf di file e salvare i file nella cartella di destinazione 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

c'è un modo per ordinare questo o per assicurarsi che sia fatto in serie? – Ian

+0

@Ian vuoi ottenere le immagini in ordine seriale. – pudaykiran

+0

sì ho appena fatto una specie sulla lista e ha funzionato. – Ian

7

Per PDFBox 2.0.1, la risposta di pudaykiran deve essere leggermente modificato dopo alcune API sono stati cambiati.

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

Ottimo! Per me va bene. Ma nel mio caso con un add-on di dipendenza jai-imageio-jpeg2000 per convertire le immagini jpeg2000. –

11

Questo è il codice che utilizza PDFBox 2.0.1 per ottenere un elenco di tutte le immagini dal PDF. Questo è diverso rispetto all'altro codice in quanto verrà recurse attraverso il documento invece di cercare di ottenere le immagini dal livello più alto.

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; 
} 
Problemi correlati