Question: Can you recommend a library that lets me add XMP data to a TIFF file? Preferably a library that can be used with Java.

Answer: 
There is [JempBox](http://jempbox.org/index.html) which is open source and allows the manipulation of XMP streams, but it doesn't look like it will read/write the XMP data in a TIFF file.

There is also [Chilkat](http://www.chilkatsoft.com/java-xmp.asp) which is not open source, but does appear to do what you want.
It's been a while, but it may still be useful to someone: **Apache Commons** has a library called [Sanselan](http://commons.apache.org/imaging/) suitable for this task. It's a bit dated and the documentation is sparse, but it does the job well nevertheless:

```java
    File file = new File("path/to/your/file");

    // Get XMP xml data from a file
    String xml = Sanselan.getXmpXml(file);

    // Process the XML data
    xml = processXml(xml);

    // Write XMP xml data from a file
    Map params = new HashMap();
    params.put(Sanselan.PARAM_KEY_XMP_XML, xml);
    BufferedImage image = Sanselan.getBufferedImage(file);
    Sanselan.writeImage(image, file, Sanselan.guessFormat(file), params);

```

You may have to be careful with multipage TIFFs though, because `Sanselan.getBufferedImage` will probably only get the first (so only the first gets written back).