2012-01-02 13 views
6

Necesito ayuda para extraer texto e imágenes de un archivo PDF con asignaciones o referencias a las imágenes en el texto extraído utilizando la biblioteca Java iText5. Si iText5 es la herramienta incorrecta para esto, por favor, avíseme recomendando otra biblioteca Java que haga la misma función.Extraiga texto e imágenes de PDF utilizando iText5

Esta es hasta ahora lo que he hecho

import java.io.IOException; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.parser.PdfReaderContentParser; 
import com.itextpdf.text.pdf.parser.PdfTextExtractor; 
import com.itextpdf.text.Paragraph; 

public class Iconverter { 

    /** 
    * @param args 
    */ 
    static int PAGE_NUMBER; 


    /** The new document to which we've added a border rectangle. */ 
    public static final String RESULT = "/home/sarah/Java for Dummies 4th Edition/Img%s.%s"; 
    public static void main(String[] args) { 
     String docText = ""; 
     String pdfName = "/home/sarah/Java for Dummies 4th Edition.pdf"; 
     Document document = new Document(); 
     document.open(); 
     try { 
      PdfReader reader = new PdfReader(pdfName); 
      PAGE_NUMBER = reader.getNumberOfPages(); 
      for(int i = 1; i <=PAGE_NUMBER; i++){ 
       docText = PdfTextExtractor.getTextFromPage(reader, i); 
      } 
      extractImages(pdfName);  
      document.add(new Paragraph("..")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     document.close(); 
    } 
    /** 
    * Parses a PDF and extracts all the images. 
    * @param src the source PDF 
    * @param dest the resulting PDF 
    */ 
    public static void extractImages(String filename) throws IOException, DocumentException { 
     PdfReader reader = new PdfReader(filename); 
     PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
     MyImageRenderListener listener = new MyImageRenderListener(RESULT); 
     for (int i = 1; i <= PAGE_NUMBER; i++) { 
      parser.processContent(i, listener); 
     } 
    } 
} 

import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

import com.itextpdf.text.pdf.PdfName; 
import com.itextpdf.text.pdf.parser.ImageRenderInfo; 
import com.itextpdf.text.pdf.parser.PdfImageObject; 
import com.itextpdf.text.pdf.parser.RenderListener; 
import com.itextpdf.text.pdf.parser.TextRenderInfo; 

public class MyImageRenderListener implements RenderListener { 

    /** The new document to which we've added a border rectangle. */ 
    protected String path = ""; 

    /** 
    * Creates a RenderListener that will look for images. 
    */ 
    public MyImageRenderListener(String path) { 
     this.path = path; 
    } 

    /** 
    * @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock() 
    */ 
    public void beginTextBlock() { 
    } 

    /** 
    * @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock() 
    */ 
    public void endTextBlock() { 
    } 

    /** 
    * @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(
    *  com.itextpdf.text.pdf.parser.ImageRenderInfo) 
    */ 
    public void renderImage(ImageRenderInfo renderInfo) { 
     try { 
      String filename; 
      FileOutputStream os; 
      PdfImageObject image = renderInfo.getImage(); 
      PdfName filter = (PdfName)image.get(PdfName.FILTER); 
      if (PdfName.DCTDECODE.equals(filter)) { 
       filename = String.format(path, renderInfo.getRef().getNumber(), "JPG"); 
       os = new FileOutputStream(filename); 
       os.write(image.getStreamBytes()); 
       os.flush(); 
       os.close(); 
      } 
      else if (PdfName.JPXDECODE.equals(filter)) { 
       filename = String.format(path, renderInfo.getRef().getNumber(), "jp2"); 
       os = new FileOutputStream(filename); 
       os.write(image.getStreamBytes()); 
       os.flush(); 
       os.close(); 
      } 
      else if (PdfName.JBIG2DECODE.equals(filter)) { 
       // ignore: filter not supported. 
      } 
      else { 
       BufferedImage awtimage = renderInfo.getImage().getBufferedImage(); 
       if (awtimage != null) { 
        filename = String.format(path, renderInfo.getRef().getNumber(), "png"); 
        ImageIO.write(awtimage, "png", new FileOutputStream(filename)); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * @see com.itextpdf.text.pdf.parser.RenderListener#renderText(
    *  com.itextpdf.text.pdf.parser.TextRenderInfo) 
    */ 
    public void renderText(TextRenderInfo renderInfo) { 
    } 
} 
+0

puedo mostrar lo que han intentado hasta ahora? –

+0

Revise mi código que acabo de agregar, gracias por cualquier ayuda –

+0

Voto a favor del esfuerzo de investigación –

Respuesta

0

Como alternativa a iText, Apache PDFBox puede ayudar.

Tome un vistazo a estas clases:

org.apache.pdfbox.ExtractImages

org.apache.pdfbox.ExtractText

+0

Desafortunadamente intenté con el pdfbox Utilicé este comando: java -jar pdfbox-app-1.6.0.jar ExtractText Java \ for \ Dummies \ 4th \ Edition.pdf java.text Pero obtuve esta excepción: ExtractText failed with the following exception: java.io.IOException: Push back buffer está lleno Creo que porque este pdf es grande ..! –

+0

@SarahM No creo que este problema dependa del tamaño del archivo ... ¿Has probado con un archivo más pequeño? – davioooh

+0

@SarahM También puede echar un vistazo a esta publicación: http://www.prasannatech.net/2009/01/convert-pdf-text-parser-java-api-pdfbox.html – davioooh