I’ve been working on a script, and this is what I’ve accomplished so far:
var doc = app.activeDocument; // Ensure there is an active document
var newLayer = doc.layers.add();
newLayer.name = "InkNames";
var inkNames = getDocumentInkNames();
var inkNameStrings = inkNames.split(", ");
var artboards = doc.artboards;
for (var i = 0; i < artboards.length; i++) {
var artboard = artboards[i];
var artboardRect = artboard.artboardRect;
var x = artboardRect[0] + 15;
var y = artboardRect[3] + artboardRect[1] + 15;
for (var i = 0; i < inkNameStrings.length; i++) {
var inkName = inkNameStrings[i];
var inkNameText = newLayer.textFrames.add();
inkNameText.contents = inkName;
inkNameText.position = [y, x];
inkNameText.rotate(90, true, true, true, true, Transformation.DOCUMENTORIGIN);
y += 70; // Adjust spacing between ink names (negative value to move upward)
}
}
function getDocumentInkNames() {
var inkNames = [];
var inks = doc.inkList;
for (var j = 0; j < inks.length; j++) {
inkNames.push(inks[j].name);
}
return inkNames.join(", ");
}
main();
function main () {
if (parseFloat(app.version) < 16) {
alert('Error\nSorry, script only works in Illustrator CS6 and later');
return;
}
if (!documents.length) {
alert('Error\nOpen a document and try again');
return;
}
var win = new Window("dialog", "Show Ink List v0.2");
win.alignChildren = ["fill", "top"];
win.spacing = 10;
win.margins = 16;
var fontGrp = win.add("group");
fontGrp.alignChildren = ["fill", "center"];
var fontLbl = fontGrp.add("statictext", undefined, "Font Size, pt:");
var fontInp = fontGrp.add("edittext", undefined, 12);
fontInp.characters = 10;
var spGrp = win.add("group");
spGrp.alignChildren = ["fill", "center"];
var spLbl = spGrp.add("statictext", undefined, "Spacing, pt:");
var spInp = spGrp.add("edittext", undefined, 15);
spInp.characters = 10;
var isSkipUnused = win.add("checkbox", undefined, "Skip Unused Spot Colors");
isSkipUnused.value = true;
var btns = win.add("group");
var cancel = btns.add("button", undefined, "Cancel", {name: "cancel"});
var ok = btns.add("button", undefined, "OK", {name: "ok"});
cancel.onClick = win.close;
ok.onClick = function () {
var doc = app.activeDocument;// Ensure there is an active document
app.executeMenuCommand('deselectall');
try {
var newLayer = doc.layers.getByName("InkNames");
newLayer.locked = false;
newLayer.visible = true;
newLayer.hasSelectedArtwork = true;
// Remove previous text labels
for (var s = app.selection.length - 1;s >= 0;s--) {
app.selection[s].remove();
}
} catch (err) {
var newLayer = doc.layers.add();
newLayer.name = "InkNames";
}
var font = parseFloat(fontInp.text);
if (isNaN(font)) font = 12;
var spacing = parseFloat(spInp.text);
if (isNaN(spacing)) spacing = 15;
var artboards = doc.artboards;
for (var i = 0; i < artboards.length;i++) {
app.executeMenuCommand('deselectall');
doc.artboards.setActiveArtboardIndex(i);
doc.selectObjectsOnActiveArtboard();
if (!app.selection.length) continue;
inks = getArtboardInks(app.selection, doc.documentColorSpace, isSkipUnused.value);
var ab = artboards[i];
var abRect = ab.artboardRect;
addInkList(doc, inks, abRect[0], abRect[3], spacing, font, newLayer);
}
if (!newLayer.pageItems.length) newLayer.remove();
app.executeMenuCommand('deselectall');
win.close();
}
win.show();
}
function addInkList(doc, inks, left, bottom, spacing, font, target) {
var x = left - spacing;
var y = bottom + spacing;
for (var i = 0; i < inks.length; i++) {
var inkName = inks[i].name;
var inkNameText = target.textFrames.add();
inkNameText.contents = inkName;
inkNameText.textRange.characterAttributes.size = font;
var inkNameTextChar = inkNameText.textRange.characterAttributes;
switch (inks[i].inkInfo.kind) {
case InkType.CYANINK:
inkNameTextChar.fillColor = setCMYKColor([100, 0, 0, 0]);
break;
case InkType.MAGENTAINK:
inkNameTextChar.fillColor = setCMYKColor([0, 100, 0, 0]);
break;
case InkType.YELLOWINK:
inkNameTextChar.fillColor = setCMYKColor([0, 0, 100, 0]);
break;
case InkType.BLACKINK:
inkNameTextChar.fillColor = setCMYKColor([0, 0, 0, 100]);
break;
case InkType.CUSTOMINK:
try {
inkNameTextChar.fillColor = doc.swatches.getByName(inkName).color;
} catch (err) {}
break;
}
inkNameText.rotate(90, true, true, true, true, Transformation.CENTER);
inkNameText.position = [x - inkNameText.width, y + inkNameText.height];
y += inkNameText.height + spacing;
}
}
function getArtboardInks(items, colorMode, isSkipUnused) {
var newDoc = app.documents.add(colorMode);
copyObjectsTo(items, newDoc);
app.executeMenuCommand('Fit Artboard to artwork bounds');
var inks = newDoc.inkList;
var result = [];
for (var i = 0; i < inks.length; i++) {
if (!isSkipUnused || inks[i].inkInfo.printingStatus === InkPrintStatus.ENABLEINK) {
result.push(inks[i]);
}
}
newDoc.close(SaveOptions.DONOTSAVECHANGES);
return result;
}
function copyObjectsTo(items, doc) {
if (Object.prototype.toString.call(items) === '[object Array]') {
for (var i = 0; i < items.length; i++) {
items[i].duplicate(doc.activeLayer, ElementPlacement.PLACEATEND);
}
} else {
items.duplicate(doc.activeLayer, ElementPlacement.PLACEATBEGINNING);
}
}
function setCMYKColor(cmyk) {
var c = new CMYKColor();
c.cyan = cmyk[0];
c.magenta = cmyk[1];
c.yellow = cmyk[2];
c.black = cmyk[3];
return c;
}
However, in Illustrator localizations with their own alphabets (Russian, Chinese, Japanese, etc.), there is a problem with getting ink names in the correct encoding. Discussions here: https://community.adobe.com/t5/illustrator-discussions/how-to-make-the-script-support-chinese-japanese-and-other-languages-when-getting-ink-name/m-p/14247791
Upd v0.2: Added isolated ink list output per artboard if objects are not hidden or locked