Copy link to clipboard
Copied
Hello!
Quick background: I have modified a script created by Kasyan (found here) that finds tags and replaces them with images. The main changes I made now have the script create an anchored text frame where the tag is found, find and insert the image file inline in the new text frame, and then grab the "Description" from the xmp link and insert it as text after the image.
The problem: when I run the script it is only able to return the metadata for the last image that is tagged/created. The rest return the "Description not found in metadata" line I included in case the data was missing. All files have the necessary info, I can reorder the tags, and no matter what - the last tag in the document is the only one that returns any data from the image file. (Thought: the script does work bottom-up so this would be the first tag/image that the script encounters.)
The code: below is the meat of the script where I made most of the changes. Most of the script outside of this section is the same as the original script by Kasyan, linked above so you can compare. I will attach the full script in case the problem cannot be found in the excerpt below:
for (var i = 0; i < foundItems.length; i++) {
foundItem = foundItems[i];
figureTagID = foundItem.contents.replace(/@/g, "");
pageNumber = GetPageNumber(foundItem);
if (log) logArr.push((i +1) + ": \t" + figureTagID + "\tpage: " + ((pageNumber != null) ? pageNumber : "N/A") + "\tfile placed: " + fileName);
story = foundItem.parentStory;
if (set.addPages && story.overflows && foundItem.parent instanceof Cell == false) {
if (debug) $.writeln("The story overflows - AddPages");
AddPages(story);
}
insPtIndex = foundItem.insertionPoints[0].index;
file = new File(imgsFolder.fsName + "/" + figureTagID);
imgFile = GetFile(imgFiles, figureTagID);
fileName = imgFile.displayName
progressBar.value = (i + 1);
progressTxt.text = figureTagID;
if(imgFile != null) {
//create caption frame
imgCaption = story.insertionPoints[insPtIndex].textFrames.add();
//set position and size of the caption frame
imgCaption.geometricBounds = [imgCaption.geometricBounds[0],
imgCaption.geometricBounds[1],
imgCaption.geometricBounds[2],
imgCaption.geometricBounds[1] + maxWidth ];
//insert container for image file
container = imgCaption.insertionPoints[0].rectangles.add();
currentStyle = container.appliedObjectStyle;
//set position and size of image file container
gb = container.geometricBounds;
width = gb[3] - gb[1];
height = gb[2] - gb[0];
container.geometricBounds = [container.geometricBounds[0],
container.geometricBounds[1],
gb[0] + maxHeight,
gb[3] ];
container.geometricBounds = [container.geometricBounds[0],
container.geometricBounds[1],
container.geometricBounds[2],
container.geometricBounds[1] + maxWidth ];
//place figure image
img = container.place(imgFile)[0];
var imgPath = img.itemLink
//set frame fitting options for image
if (set.fitOption > 1) {
container.fit(fitOptions[set.fitOption - 2]);
if (set.fitFrameToContents && (set.fitOption == 6 || set.fitOption == 7)) {
container.fit(FitOptions.FRAME_TO_CONTENT);
}
}
//find and place metadata as caption
if (imgDescription != null) {
//placeholder if no metadata found
imgCaption.insertionPoints[-1].contents = "\r Description not found in metadata";
}
else {
//get XMP Description
var imgDescription = imgPath.linkXmp.description;
//add caption contents from XMP Description
imgCaption.insertionPoints[-1].contents = "\r" + imgDescription;
}
//finalize styles
imgCaption.applyObjectStyle(currentStyle);
imgCaption.clearObjectStyleOverrides ();
container.applyObjectStyle(app.activeDocument.objectStyleGroups.itemByName("Figures"));
container.clearObjectStyleOverrides ();
//remove figure tag from text
foundItem.remove();
story.recompose();
count++;
}
else {
logErrArr.push(figureTagID + " - the file doesn't exist." + " - page " + ((pageNumber != null) ? pageNumber : "N/A"));
}
} // end for
NOTE: also, infuriatingly, I did have the description loading for all images at one point, but broke it when putting together the code that places the image file in the new text frame.
Thank you all so much for any help you can offer.
Yes, I saw this line - but it's set ONLY if imgDescription isn't empty - so this part of the code - else - should never be executed?
Yes, you should try to set its value in a try...catch() - but then you don't need to check if it's empty - because if it was not possible to set it - you'll get an error and then you can set your "missing" message in the catch part.
Copy link to clipboard
Copied
I'm not JS expert - but you are checking if "imgDescription" is not empty - but you are not applying a value to it before?
So it's always empty... A bit strange, that it isn't for the last item in the loop?
Copy link to clipboard
Copied
thanks for taking the time 🙂
there is this bit of code in there:
var imgDescription = imgPath.linkXmp.description;
are you saying the issue could be in the order of the code and that I'm asking to see if imgDescription is empty before it is defined?
Copy link to clipboard
Copied
Yes, I saw this line - but it's set ONLY if imgDescription isn't empty - so this part of the code - else - should never be executed?
Yes, you should try to set its value in a try...catch() - but then you don't need to check if it's empty - because if it was not possible to set it - you'll get an error and then you can set your "missing" message in the catch part.
Copy link to clipboard
Copied
thank you so much! so the new code there would look like this?
//find and place metadata as caption
try {
//get XMP Description
var imgDescription = imgPath.linkXmp.description;
//add caption contents from XMP Description
imgCaption.insertionPoints[-1].contents = "\r" + imgDescription;
}
catch (imgDescription != null) {
//placeholder if no metadata found
imgCaption.insertionPoints[-1].contents = "\r Description not found in metadata";
}
I'll give it a shot and let you know how it goes!
Copy link to clipboard
Copied
I don't think you need to check it for being empty - catch part is executed only when try fails - so catch(e) {...} would be enough.
Copy link to clipboard
Copied
PROGRESS!!
description !=null broke the script, it had to be "err" as you suggested.
It failed on a bunch of tags but then I limited it to just three tags and it worked for both! so this did solve the "only the last guy" issue. THANK YOU SO MUCH!!!
but now the "catch" part is throwing the error "undefined is not an object" for this line which worked (too well) before:
imgCaption.insertionPoints[-1].contents = "\r Description not found in metadata";
Copy link to clipboard
Copied
You are welcome.
if(imgFile != null) {
//create caption frame
imgCaption = story.insertionPoints[insPtIndex].textFrames.add();
Maybe because this part isn't executed?
You should move your try...catch code inside - at the end - of this if - so it will be executed ONLY when file has been imported correctly?
Copy link to clipboard
Copied
hmmmmmm moving it didn't help - I also don't understand why the same code would work in the "try" section but then not in the "catch" section (the only difference is the content, and the "catch" content is just text). Any additinal insight would be great - I'm going to keep fiddling.
I've marked your answer up above as correct, since that part solved the original issue. Thank you so much once again for your help!
Copy link to clipboard
Copied
Copy link to clipboard
Copied
full script attached and here's a larger exerpt:
if (imgsFolder != null) {
imgFiles = GetFiles(imgsFolder);
for (var i = 0; i < foundItems.length; i++) {
foundItem = foundItems[i];
figureTagID = foundItem.contents.replace(/@/g, "");
pageNumber = GetPageNumber(foundItem);
if (log) logArr.push((i +1) + ": \t" + figureTagID + "\tpage: " + ((pageNumber != null) ? pageNumber : "N/A") + "\tfile placed: " + fileName);
story = foundItem.parentStory;
if (set.addPages && story.overflows && foundItem.parent instanceof Cell == false) {
if (debug) $.writeln("The story overflows - AddPages");
AddPages(story);
}
insPtIndex = foundItem.insertionPoints[0].index;
file = new File(imgsFolder.fsName + "/" + figureTagID);
imgFile = GetFile(imgFiles, figureTagID);
fileName = imgFile.displayName
progressBar.value = (i + 1);
progressTxt.text = figureTagID;
if(imgFile != null) {
//create caption frame
imgCaption = story.insertionPoints[insPtIndex].textFrames.add();
//set position and size of the caption frame
imgCaption.geometricBounds = [imgCaption.geometricBounds[0],
imgCaption.geometricBounds[1],
imgCaption.geometricBounds[2],
imgCaption.geometricBounds[1] + maxWidth ];
//insert container for image file
container = imgCaption.insertionPoints[0].rectangles.add();
currentStyle = container.appliedObjectStyle;
//set position and size of image file container
gb = container.geometricBounds;
width = gb[3] - gb[1];
height = gb[2] - gb[0];
container.geometricBounds = [container.geometricBounds[0],
container.geometricBounds[1],
gb[0] + maxHeight,
gb[3] ];
container.geometricBounds = [container.geometricBounds[0],
container.geometricBounds[1],
container.geometricBounds[2],
container.geometricBounds[1] + maxWidth ];
//place figure image
img = container.place(imgFile)[0];
var imgPath = img.itemLink
//set frame fitting options for image
if (set.fitOption > 1) {
container.fit(fitOptions[set.fitOption - 2]);
if (set.fitFrameToContents && (set.fitOption == 6 || set.fitOption == 7)) {
container.fit(FitOptions.FRAME_TO_CONTENT);
}
}
//finalize styles
imgCaption.applyObjectStyle(currentStyle);
imgCaption.clearObjectStyleOverrides ();
container.applyObjectStyle(app.activeDocument.objectStyleGroups.itemByName("Figures"));
container.clearObjectStyleOverrides ();
//remove figure tag from text
foundItem.remove();
story.recompose();
//find and place metadata as caption
try {
//get XMP Description
var imgDescription = imgPath.linkXmp.description;
//add caption contents from XMP Description
imgCaption.insertionPoints[-1].contents = "\r" + imgDescription;
}
catch (err) {
//placeholder if no metadata found
imgCaption.insertionPoints[-1].contents = "\r Description not found in metadata";
}
count++;
}
else {
logErrArr.push(figureTagID + " - the file doesn't exist." + " - page " + ((pageNumber != null) ? pageNumber : "N/A"));
}
} // end for
progressWin.close();
var endTime = new Date(),
duration = GetDuration(startTime, endTime);
var report = "Finished. " + count + " image" + ((count == 1) ? " was" : "s were") + " placed.";
if (logErrArr.length > 0) report += " " + logErrArr.length + " error"+ ((logErrArr.length == 1) ? "" : "s") + " occurred."
if (log && logErrArr.length > 0) report += " See the error log on the desktop.";
report += "\rTime elapsed: " + duration;
if (log) {
logArr.push("=========================================================");
logArr.push(count + " image" + ((count == 1) ? " was" : "s were") + " placed.");
logArr.push("Time elapsed: " + duration);
logArr.push("=========================================================");
if (logErrArr.length > 0) {
logArr.push("ERRORS:");
logArr = logArr.concat(logErrArr);
}
logArr.push("\n");
var logTxt = logArr.join("\r");
Log(logTxt, logFilePath, false);
}
if (!debug) {
alert(report, scriptName, false);
}
else {
$.writeln(report);
}
}
}
catch(err) {
if (debug) $.writeln(err.message + ", line: " + err.line);
alert("Critical error: " + err.message + ", line: " + err.line, scriptName, true);
}
Copy link to clipboard
Copied
Can you confirm that it is working at all?
Does it work for some found results and not for others?
Because I don't think the new version should work at all...
Copy link to clipboard
Copied
the script only works when it doesn't encounter any images that are missing the metadata. if it's all there it runs perfectly and places all the images and captions the way I want them to.
If the script runs on something where the image is missing the description data, then instead of placing the text "Description not found in metadata" then it crashes the script with the error "undefined is not an object" for the same line as before (now just in a different place)
same error occured before I moved that section around and that script looked like this (also see attached):
for (var i = 0; i < foundItems.length; i++) {
foundItem = foundItems[i];
figureTagID = foundItem.contents.replace(/@/g, "");
pageNumber = GetPageNumber(foundItem);
if (log) logArr.push((i +1) + ": \t" + figureTagID + "\tpage: " + ((pageNumber != null) ? pageNumber : "N/A") + "\tfile placed: " + fileName);
story = foundItem.parentStory;
if (set.addPages && story.overflows && foundItem.parent instanceof Cell == false) {
if (debug) $.writeln("The story overflows - AddPages");
AddPages(story);
}
insPtIndex = foundItem.insertionPoints[0].index;
file = new File(imgsFolder.fsName + "/" + figureTagID);
imgFile = GetFile(imgFiles, figureTagID);
fileName = imgFile.displayName
progressBar.value = (i + 1);
progressTxt.text = figureTagID;
if(imgFile != null) {
//create caption frame
imgCaption = story.insertionPoints[insPtIndex].textFrames.add();
//set position and size of the caption frame
imgCaption.geometricBounds = [imgCaption.geometricBounds[0],
imgCaption.geometricBounds[1],
imgCaption.geometricBounds[2],
imgCaption.geometricBounds[1] + maxWidth ];
//insert container for image file
container = imgCaption.insertionPoints[0].rectangles.add();
currentStyle = container.appliedObjectStyle;
//set position and size of image file container
gb = container.geometricBounds;
width = gb[3] - gb[1];
height = gb[2] - gb[0];
container.geometricBounds = [container.geometricBounds[0],
container.geometricBounds[1],
gb[0] + maxHeight,
gb[3] ];
container.geometricBounds = [container.geometricBounds[0],
container.geometricBounds[1],
container.geometricBounds[2],
container.geometricBounds[1] + maxWidth ];
//place figure image
img = container.place(imgFile)[0];
var imgPath = img.itemLink
//set frame fitting options for image
if (set.fitOption > 1) {
container.fit(fitOptions[set.fitOption - 2]);
if (set.fitFrameToContents && (set.fitOption == 6 || set.fitOption == 7)) {
container.fit(FitOptions.FRAME_TO_CONTENT);
}
}
//find and place metadata as caption
try {
//get XMP Description
var imgDescription = imgPath.linkXmp.description;
//add caption contents from XMP Description
imgCaption.insertionPoints[-1].contents = "\r" + imgDescription;
}
catch (err) {
//placeholder if no metadata found
imgCaption.insertionPoints[-1].contents = "\r Description not found in metadata";
}
//finalize styles
imgCaption.applyObjectStyle(currentStyle);
imgCaption.clearObjectStyleOverrides ();
container.applyObjectStyle(app.activeDocument.objectStyleGroups.itemByName("Figures"));
container.clearObjectStyleOverrides ();
//remove figure tag from text
foundItem.remove();
story.recompose();
count++;
}
else {
logErrArr.push(figureTagID + " - the file doesn't exist." + " - page " + ((pageNumber != null) ? pageNumber : "N/A"));
}
} // end for
Copy link to clipboard
Copied
You are missing this part in your new code:
//remove figure tag from text
foundItem.remove(); story.recompose();
which I think might have been a problem before.
I'm sorry but I'm not JS guy so I might be missing something about how try...catch works.
@rob day, @Peter Kahrel, @brian_p_dts - can you pitch in?
Copy link to clipboard
Copied
Kasyan (@kas) would be best placed to deal with this.
Copy link to clipboard
Copied
Kasyan (@kas) would be best placed to deal with this.
By @Peter Kahrel
Thanks, but I think @Kasyan Servetsky would be better?
Copy link to clipboard
Copied
Absolutely, haha! Thanks.