Skip to main content
MidoSemsem
Inspiring
July 4, 2024
Answered

Adding Color Names Instead of Color Bars

  • July 4, 2024
  • 2 replies
  • 3698 views

Hi everyone,

 

I'm looking for a way to save a PDF file with color information, specifically to write separation color names instead of the standard color bar. The typical trim and marks provide a color bar, but I need to add the actual color names in their corresponding colors.

 

Any help is appreciated!

 

This topic has been closed for replies.
Correct answer Sergey Osokin

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

2 replies

jduncan
Community Expert
Community Expert
July 4, 2024

I'm, not near a computer but I have an old script that places spot color names on the document for screen printing separations. It may give you some insight in how the process.

 

https://github.com/joshbduncan/illustrator-scripts/blob/main/jsx/ScreenSepMarks.jsx

MidoSemsem
Inspiring
July 4, 2024

Thanks @jduncan 
Nice script by the way, but I cannot add document color names

MidoSemsem
Inspiring
July 4, 2024

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(", ");
}

 

 

m1b
Community Expert
Community Expert
July 4, 2024

Hi @MidoSemsem, the best way forward is to post a pdf showing exactly what you ideally would like. Then people can look at that and see if they know a way. Good luck.

- Mark

MidoSemsem
Inspiring
July 4, 2024

Thank you @m1b , 
I want to use the color names as in "Color Names.pdf" file instead of color bar