package server;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
import org.apache.commons.imaging.formats.tiff.TiffField;
import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
import org.apache.commons.imaging.formats.tiff.constants.MicrosoftTagConstants;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class FileMetadataUtil {
private static Logger log = LogManager.getLogger( FileMetadataUtil.class.getName() );
// public static String[] getXPKeywords( String path ) {
// return getXPKeywords( new File( path ));
// }
public static String[] getXPKeywords( InputStream is, String path ) {
try {
final JpegImageMetadata jpeg = (JpegImageMetadata) Imaging.getMetadata( new File(path) );
if (jpeg == null) return new String[0];
final TiffField field = jpeg.findEXIFValueWithExactMatch(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS);
if (field == null) return new String[0];
return field.getStringValue().trim().split( ";" );
} catch( ClassCastException e ) {
log.warn( "Image has no Jpeg metadata" );
return new String[0];
} catch( ImageReadException | IOException e ) {
log.error( e, e );
return new String[0];
}
}
public static boolean writeXPKeywords( File file, String keywords ) {
OutputStream os = null;
try {
TiffOutputSet outset = null;
final JpegImageMetadata jpgMeta = (JpegImageMetadata) Imaging.getMetadata( file );
if( jpgMeta != null ) {
final TiffImageMetadata exif = jpgMeta.getExif();
if( exif != null ) outset = exif.getOutputSet();
}
if( outset == null ) return false;
TiffOutputDirectory ifd = outset.getOrCreateExifDirectory();
ifd.removeField( MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS );
ifd.add( MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS, keywords );
os = new FileOutputStream( file );
os = new BufferedOutputStream( os );
new ExifRewriter().updateExifMetadataLossless( file, os, outset );
os.close();
os = null;
return true;
} catch( ImageReadException | ClassCastException | IOException | ImageWriteException e ) {
log.error( e, e );
return false;
} finally { if( os != null ) try { os.close(); } catch( IOException e ) {} }
}
}