Legend
August 3, 2026
Answered
Why did the caption generated by this script change to 'Default'?
- August 3, 2026
- 9 replies
- 86 views
Hi
Long time no see, I miss you very much.
The original post cannot be replied to
Today I came across several strange pictures, some of which had their captions changed to 'Default' after using this script.
Some of them are errors below the prompt. I guess they are not recognizing the image, or the image is outside the layout, or there are locked or hidden images?
Also, can we avoid grouping images and captions together? Because this feature is actually not practical.


Here is the code (unchanged)
/**
* @discussion https://community.adobe.com/t5/indesign-discussions/is-there-a-way-to-apply-generic-static-caption-to-all-graphic-containers/m-p/13367937#M503941
*/
function main() {
var doc = app.activeDocument,
graphics = doc.allGraphics;
// add caption to each graphic in document
for (var i = 0; i < graphics.length; i++) {
var contents = (
// try to get the graphic's xmp "description"
getXMPProperty(graphics[i], 'description')
// or fall back to the link filename
|| graphics[i].itemLink.name
);
addCaptionToGraphic(
{
doc: doc,
graphic: graphics[i],
contents: contents,
objectStyleName: 'Caption',
captionBoxHeight: 40, // pts
groupCaptionWithGraphic: true,
}
);
}
/**
* Adds a caption text frame
* to the graphic.
* @author m1b
* @version 2022-11-24
* Note: will use "No contents" if contents is empty.
* @param {Object} options
* @param {Graphic} options.graphic - an Indesign Graphic.
* @param {String} options.contents - the text of the caption.
* @param {String} [options.objectStyleName] - name of the object style to apply.
* @param {Number|String} [options.captionBoxHeight] - height of the caption box (default: to fit).
* @param {Boolean} [options.groupCaptionWithGraphic] - whether to group the caption with the graphic's frame.
* @returns {TextFrame|Group} - the caption's text frame or, if grouped, the group.
*/
function addCaptionToGraphic(options) {
app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS;
options = options || {};
var doc = options.doc || app.activeDocument,
graphic = options.graphic,
contents = options.contents || 'No contents',
objectStyle = getByName(doc.allObjectStyles, options.objectStyleName),
captionBoxHeight = options.captionBoxHeight || 10,
captionBox,
frame = graphic.parent,
b = frame.geometricBounds;
if (graphic.parentPage == null)
// don't process graphics on pasteboard
return;
// add a frame for the caption text
captionBox = graphic.parentPage.textFrames.add();
// set position and size of the caption
captionBox.geometricBounds = [b[2], b[1], b[2] + captionBoxHeight, b[3]];
//add caption text
captionBox.contents = String(contents);
// expand to handle overflow
var counter = 0;
while (
captionBox.overflows == true
&& counter++ < 1000
)
// add 5 pts height
captionBox.resize(CoordinateSpaces.PARENT_COORDINATES, AnchorPoint.TOP_LEFT_ANCHOR, ResizeMethods.ADDING_CURRENT_DIMENSIONS_TO, [0, 5])
if (
objectStyle != undefined
&& objectStyle.isValid
)
// set captionBox's object style
captionBox.applyObjectStyle(objectStyle);
if (options.groupCaptionWithGraphic !== false)
// group
try {
doc.groups.add([frame, captionBox]);
} catch (error) { }
};
/**
* Returns a graphic's XMP property contents.
* Example XMP property names:
* author, copyrightInfoURL, copyrightNotice,
* copyrightStatus, creationDate, creator,
* description, documentTitle, format, jobName,
* keywords, modificationDate, serverURL
* @author m1b
* @version 2022-11-24
* @param {Graphic} graphic - an Indesign Graphic.
* @param {String} property - the desired XMP property name.
* @returns {String}
*/
function getXMPProperty(graphic, property) {
if (!graphic.isValid)
return;
try {
return graphic.itemLink.linkXmp[property];
} catch (error) {
/* metadata not available */
}
};
/**
* Returns a style matching name.
* @author m1b
* @version 2022-08-14
* @param {Array<style>} styles - an array or collection of styles.
* @param {String} name - the name to match.
* @returns {style}
*/
function getByName(styles, name) {
for (var i = 0; i < styles.length; i++)
if (styles[i].name == name)
return styles[i];
};
} // end main
main();

