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.