Skip to main content
Participating Frequently
April 23, 2012
Answered

Can you import metadata from an excel database to images (JPG, PSD, TIF) in bulk?

  • April 23, 2012
  • 3 replies
  • 42435 views

I am very new to working with metadata. I have a microsoft excel file with the IPTC Core fields I need for each image file.

(Creator, Headline, Description, Keywords, Title, Job Identifier, Credit Line, Source, Rights Usage Terms, Copyright Status and Copyright Notice)

Is there a way to get the metadata into the files without having to copy from a cell into each metadata field individually?

I am hoping some for sort of script, possibly...

Also, if only ONE of these fields needed updating in all of the files (i.e. Rights Usage Terms) can that be done?

I have Bridge 5.1 (and earlier versions CS3/CS4)

This topic has been closed for replies.
Correct answer Stephen Marsh

Perhaps try tab delimited format instead of comma separated value format.

 

Edit – Paul Riggott originally wrote the following instructions:

 

 

N.B. The first field in the input file MUST be the filename only IE:- CRW_0001.jpg

This script will allow you to choose the fields and order they are in within either your CSV or TEXT file so that you can input your metadata.

Fields available are:-

Keywords 1 - These are Keywords that are in ONE field seperated by semicolons

Keywords 2 - These are Keywords in seperate fields. These must be last in the list/file!

N.B. Only one type of Keywords allowed!

Description - Text, if commas are in this field input file MUST be Tab Delimited!

Headline - Text, if commas are in this field input file MUST be Tab Delimited!

Title - Text, if commas are in this field input file MUST be Tab Delimited!

Instructions - Text, if commas are in this field input file MUST be Tab Delimited!

Date Created - Date IE: 12/24/2001

Location - Text, if commas are in this field input file MUST be Tab Delimited!

City - Text

Country - Text

Rating - This should be numeric 1 to 5

CopyrightInfo - Text, if commas are in this field input file MUST be Tab Delimited!

Author - Text

Label - Text, one of Select, Second, Approved, Review or To Do

There is the option to remove a header line if one exists.

Sub-Folders are supported.

Copyright all documents supported.

An error file is created and shown on completion.

3 replies

Known Participant
November 7, 2018

Hi!

Can we use the exact same script for EPS files? I noticed that in Bridge CC 2019 when we click a EPS we can edit it's metadata (title, description, keywords) directly in Bridge.

Knowing this, would a script be possible to read a CSV and import those fields into a EPS instead of a JPG?

Stephen Marsh
Community Expert
Community Expert
November 7, 2018

Hi!

Can we use the exact same script for EPS files? I noticed that in Bridge CC 2019 when we click a EPS we can edit it's metadata (title, description, keywords) directly in Bridge.

Knowing this, would a script be possible to read a CSV and import those fields into a EPS instead of a JP

Yes, the DIY Metadata script works with a Photoshop EPS file (I have not tested with Illustrator EPS):

And it also works for the VRA tool as well:

Known Participant
November 8, 2018

Ok, in the past I tried DIY Metadata script and I didn't seem to work with illustrator EPS (that is the kind of EPS I am trying to work on). I will give it another try along with VRA panel and will post here if it works with Illustrator EPS. Thanks a lot for the suggestion.

Stephen Marsh
Community Expert
Community Expert
April 14, 2016
Paul Riggott
Inspiring
April 23, 2012

This might be of use...

DIY Metadata.jsx

 

EDIT: the link is there now: DIY Metadata.jsx

Participant
December 9, 2017

Hey Paul, I'm trying to edit your script to fill in the "IPTC Subject Code" and keep getting an error from the log for my added input/variable. I basically used other fields as an example to edit the code. I can get your predefined fields to work when using a csv for the input, but can't get my own added IPTC Subject Code to to write. Please help 

Participating Frequently
February 12, 2019

Please try this now.

N.B. The last three fields in the csv are not required as they are duplicates.

//   #target bridge  

    if( BridgeTalk.appName == "bridge" ) {  

    var drone = new MenuElement( "command", "Drone Metadata", "at the end of Tools" ); 

    } 

    drone.onSelect = function () { 

    var csvFile = File.openDialog("Open Comma-delimited File","comma-delimited(*.csv):*.csv;"); 

    if (!csvFile.exists) return;

    var folder = Folder(app.document.thumbnail.path);

    if(!folder.exists){

        log("You are not in a valid folder. Is this a collection?");

        return;

        }

        csvFile.open('r'); 

        var data = csvFile.read().split("\n"); 

        csvFile.close(); 

        var line = new Array(); 

        for(var a in data){ 

            var Q = data.toString(); 

            if(Q.length > 2) line.push(Q); 

            } 

    for(var z in line){ 

    var p=line.split(','); 

    droneMetadata(trim(p[0]),trim(p[1]),trim(p[2]),trim(p[3]),trim(p[4]),trim(p[5]),trim(p[6]),trim(p[7]));

    } 

    alert("Batch complete\nDrone Error Log on Desktop\n If any errors occured"); 

    function trim(s){ 

        return s.replace(/^\s+|\s+$/g,''); 

        } 

    function log(message){ 

    var errorLog = File(Folder.desktop + "/Drone Error Log.txt"); 

    errorLog.open("a"); 

    errorLog.writeln(message); 

    errorLog.close(); 

      } 

  function ddToDms(lat, lng) {

   var lat = lat;

   var lng = lng;

   var latResult, lngResult, dmsResult;

   lat = parseFloat(lat); 

   lng = parseFloat(lng);

   latResult = getDms(lat);

   latResult += (lat >= 0)? 'N' : 'S';

   lngResult = getDms(lng);

   lngResult += (lng >= 0)? 'E' : 'W';

   dmsResult = [latResult, lngResult];

   return dmsResult;

};

function getDms(val) {

   var valDeg, valMin, valSec, result;

   val = Math.abs(val);

   valDeg = Math.floor(val);

   result = valDeg + ",";

   valMin = Math.floor((val - valDeg) * 60);

   result += valMin + ".";

   valSec = Math.round((val - valDeg - valMin / 60) * 3600 * 1000);

   result += valSec.toString().match(/^\d{4}/);

   return result;

};

    function droneHeight(H){

        return Math.floor(H*1000).toString() + "/1000";

        }

    function droneMetadata(th,Flag,StdLon,StdLat,StdHgt,Lat,Lon,Hgt){ 

    var file = new File(new Folder(folder)+ '/' + trim(th)); 

    if(!file.exists){ 

        log("File does not exist! " + trim(th)); 

        return; 

        } 

    var thumb = new Thumbnail(file); 

    md = thumb.synchronousMetadata; 

    if(thumb.hasMetadata){ 

    md.namespace = "http://www.dji.com/drone-dji/1.0/"; 

md.RtkFlag = ''; 

md.RtkFlag =  Flag; 

md.RtkStdLon = ''; 

md.RtkStdLon = StdLon; 

md.RtkStdLat = ''; 

md.RtkStdLat = StdLat; 

md.RtkStdHgt = ''; 

md.RtkStdHgt = StdHgt; 

md.GpsLatitude = ''; 

md.GpsLatitude = Lat; 

md.GpsLongitude = ''; 

md.GpsLongitude = Lon; 

md.AbsoluteAltitude = ''; 

md.AbsoluteAltitude = Hgt;

var LatLon = ddToDms(Lon,Lat);

md.namespace = "http://ns.adobe.com/exif/1.0/";

md.GPSLatitude = ''; 

md.GPSLatitude = LatLon[0]; 

md.GPSLongitude = ''; 

md.GPSLongitude = LatLon[1]; 

md.GPSAltitude = ''; 

md.GPSAltitude = droneHeight(Hgt); 

    }else{ 

        log("Cannot write metadata to " + decodeURI(thumb.spec)); 

        } 

    }; 

    }; 


SuperMerlin,

Just looking through the code (cross eyed!).  On Line 40 Longitude is referenced in the JS as [Lng] where down below for the tags it is referenced as [Lon] .  I could not tell if they should be the same or not.

tim