2011-07-26 31 views
10

Tengo un archivo PDF que es un resultado de un procesador OCR, este procesador OCR reconoce la imagen, agrega el texto al pdf pero al final coloca una imagen de baja calidad en lugar de la original (no tengo idea de por qué alguien lo haría haz eso, pero lo hacen).¿Cómo puedo eliminar todas las imágenes/dibujos de un archivo PDF y dejar el texto solo en Java?

Entonces, me gustaría obtener este PDF, eliminar la secuencia de imágenes y dejar el texto solo, para poder obtenerlo e importarlo (usando la función de importación de páginas iText) a un PDF que me estoy creando con el real imagen.

Y antes de que alguien pregunte, ya he intentado utilizar otra herramienta para extraer las coordenadas del texto (JPedal), pero cuando dibujo el texto en mi PDF no está en la misma posición que el original.

Prefiero tener esto hecho en Java, pero si otra herramienta puede hacerlo mejor, házmelo saber. Y podría ser solo la eliminación de imágenes, puedo vivir con un PDF con los dibujos allí.

+0

¿En qué formato están las imágenes? – Seitaridis

+0

JPEG. TIFF, GIF y PNG. –

Respuesta

14

Utilicé Apache PDFBox en una situación similar.

Para ser un poco más específico, a intentar algo así:

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.exceptions.CryptographyException; 
import org.apache.pdfbox.exceptions.InvalidPasswordException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDDocumentCatalog; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDResources; 
import java.io.IOException; 

public class Main { 
    public static void main(String[] argv) throws COSVisitorException, InvalidPasswordException, CryptographyException, IOException { 
     PDDocument document = PDDocument.load("input.pdf"); 

     if (document.isEncrypted()) { 
      document.decrypt(""); 
     } 

     PDDocumentCatalog catalog = document.getDocumentCatalog(); 
     for (Object pageObj : catalog.getAllPages()) { 
      PDPage page = (PDPage) pageObj; 
      PDResources resources = page.findResources(); 
      resources.getImages().clear(); 
     } 

     document.save("strippedOfImages.pdf"); 
    } 
} 

Se supone que eliminar todo tipo de imágenes (PNG, JPEG, ...). Debería funcionar así:

Sample article http://s3.postimage.org/28f6boykk/before.jpg.

+0

Hola @IceGlow, como he explicado anteriormente, puedo extraer el texto usando JPedal, pero eso no es lo que estoy buscando, quiero eliminar las secuencias de imágenes del documento PDF en sí. Imagine que es como tratar de eliminar todas las etiquetas de un documento HTML, es solo que esto es bastante complicado de hacer con los archivos PDF. Pero gracias de todos modos por la respuesta. –

+0

Gracias! Voy a probar esto! –

+0

¡Y lo hizo! Muchas gracias @IceGlow! –

5

Es necesario analizar el documento de la siguiente manera:

public static void strip(String pdfFile, String pdfFileOut) throws Exception { 

    PDDocument doc = PDDocument.load(pdfFile); 

    List pages = doc.getDocumentCatalog().getAllPages(); 
    for(int i=0; i<pages.size(); i++) { 
     PDPage page = (PDPage)pages.get(i); 

     // added 
     COSDictionary newDictionary = new COSDictionary(page.getCOSDictionary()); 

     PDFStreamParser parser = new PDFStreamParser(page.getContents()); 
     parser.parse(); 
     List tokens = parser.getTokens(); 
     List newTokens = new ArrayList(); 
     for(int j=0; j<tokens.size(); j++) { 
      Object token = tokens.get(j); 

      if(token instanceof PDFOperator) { 
       PDFOperator op = (PDFOperator)token; 
       if(op.getOperation().equals("Do")) { 
        //remove the one argument to this operator 
        // added 
        COSName name = (COSName)newTokens.remove(newTokens.size() -1); 
        // added 
        deleteObject(newDictionary, name); 
        continue; 
       } 
      } 
      newTokens.add(token); 
     } 
     PDStream newContents = new PDStream(doc); 
     ContentStreamWriter writer = new ContentStreamWriter(newContents.createOutputStream()); 
     writer.writeTokens(newTokens); 
     newContents.addCompression(); 

     page.setContents(newContents); 

     // added 
     PDResources newResources = new PDResources(newDictionary); 
     page.setResources(newResources); 
    } 

    doc.save(pdfFileOut); 
    doc.close(); 
} 


// added 
public static boolean deleteObject(COSDictionary d, COSName name) { 
    for(COSName key : d.keySet()) { 
     if(name.equals(key)) { 
      d.removeItem(key); 
      return true; 
     } 
     COSBase object = d.getDictionaryObject(key); 
     if(object instanceof COSDictionary) { 
      if(deleteObject((COSDictionary)object, name)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
+0

Intenté utilizar su función después de encontrarme con el mismo problema que @Pushkar. No estoy familiarizado con Java y me interesa principalmente deshacerme de las imágenes. ¿Te importaría expandir tu script a un archivo utilizable (especialmente con todas las importaciones necesarias)? – Tim

+0

¡Esto funciona! La carga y el cambio de páginas ahora es mucho más rápido. Sin embargo, el tamaño del archivo no ha disminuido (76 MB con imágenes, 78 MB sin imágenes). ¿Hay alguna manera de deshacerse de las imágenes, para que los archivos se vuelvan más pequeños de nuevo? – Tim

+0

Este código funciona. – codin

Cuestiones relacionadas