Saltar al contenido

¿Cómo puedo extraer imágenes y sus metadatos de archivos PDF?

Verificamos exhaustivamente cada uno de los enunciados de nuestro espacio con la meta de enseñarte en todo momento la información certera y certera.

Solución:

Las imágenes no contienen metadatos y se almacenan como datos sin procesar que deben ensamblarse en imágenes. Escribí 2 publicaciones de blog que explican cómo se almacenan los datos de imagen en un archivo PDF en https://blog.idrsolutions.com/2010/04/understanding-the-pdf-file-format-how-are-images-stored/ y https ://blog.idrsolutions.com/2010/09/understanding-the-pdf-file-format-images/

No estoy de acuerdo con los demás y tengo un POC para su pregunta: puede extraer los metadatos XMP de las imágenes usando pdfbox de la siguiente manera:

public void getXMPInformation() 
    // Open PDF document
    PDDocument document = null;
    try 
        document = PDDocument.load(PATH_TO_YOUR_DOCUMENT);
     catch (IOException e) 
        e.printStackTrace();
    
    // Get all pages and loop through them
    List pages = document.getDocumentCatalog().getAllPages();
    Iterator iter = pages.iterator();
    while( iter.hasNext() ) 
        PDPage page = (PDPage)iter.next();
        PDResources resources = page.getResources();            
        Map images = null;
        // Get all Images on page
        try 
            images = resources.getImages();
         catch (IOException e) 
            e.printStackTrace();
        
        if( images != null ) 
            // Check all images for metadata
            Iterator imageIter = images.keySet().iterator();
            while( imageIter.hasNext() ) 
                String key = (String)imageIter.next();
                PDXObjectImage image = (PDXObjectImage)images.get( key );
                PDMetadata metadata = image.getMetadata();
                System.out.println("Found a image: Analyzing for Metadata");
                if (metadata == null) 
                    System.out.println("No Metadata found for this image.");
                 else 
                    InputStream xmlInputStream = null;
                    try 
                        xmlInputStream = metadata.createInputStream();
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    try 
                        System.out.println("--------------------------------------------------------------------------------");
                        String mystring = convertStreamToString(xmlInputStream);
                        System.out.println(mystring);
                     catch (IOException e) 
                        e.printStackTrace();
                    
                
                // Export the images
                String name = getUniqueFileName( key, image.getSuffix() );
                    System.out.println( "Writing image:" + name );
                    try 
                        image.write2file( name );
                     catch (IOException e) 
                        // TODO Auto-generated catch block
                        //e.printStackTrace();
                
                System.out.println("--------------------------------------------------------------------------------");
            
        
    

Y los “métodos auxiliares”:

public String convertStreamToString(InputStream is) throws IOException 
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    if (is != null) 
        StringBuilder sb = new StringBuilder();
        String line;

        try 
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            while ((line = reader.readLine()) != null) 
                sb.append(line).append("n");
            
         finally 
            is.close();
        
        return sb.toString();
     else        
        return "";
    


private String getUniqueFileName( String prefix, String suffix ) 

Nota: Esta es una prueba de concepto rápida y sucia y no un código bien diseñado.

Las imágenes deben tener metadatos XMP cuando se colocan en InDesign antes de crear el documento PDF. Los datos XMP-Metdata se pueden configurar usando Photoshop, por ejemplo. Tenga en cuenta que no toda la información IPTC/Exif/… se convierte en metadatos XMP. Solo se convierte una pequeña cantidad de campos.

Estoy usando este método en imágenes JPG y PNG, colocadas en archivos PDF creados con InDesign. Funciona bien y puedo obtener toda la información de la imagen después de los pasos de producción de los PDF listos (revestimiento de imagen).

Comentarios y puntuaciones

Te invitamos a añadir valor a nuestro contenido informacional asistiendo con tu veteranía en las ilustraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *