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 22, 2024

This will slow down the script considerably for complex documents. This is because the script has to remember and restore the state of layers and objects.


@Sergey Osokin Check this out  😉

 

 

var doc = app.activeDocument;  // Reference to the active document
        // Create 'Inks' sublayer
        var inkNamesLayer = doc.layers.add();
        inkNamesLayer.name = "Inks";
        
        // Main function to apply the script logic to each artboard
function applyScriptToEachArtboard() {
    var artboards = doc.artboards; // Array of artboards in the document

    // Save the status of all items before modifying them
    function saveItemStatuses() {
        var itemStatuses = [];
        for (var k = 0; k < doc.pageItems.length; k++) {
            var item = doc.pageItems[k];
            itemStatuses.push({
                item: item,
                locked: item.locked,
                                hidden: item.hidden

            });
        }
        return itemStatuses;
    }

    // Restore the status of all items after processing
    function restoreItemStatuses(itemStatuses) {
        for (var l = 0; l < itemStatuses.length; l++) {
            var status = itemStatuses[l];
                        status.item.locked = status.locked;
            status.item.hidden = status.hidden;
        }
    }

    // Process each artboard
    for (var i = 0; i < artboards.length; i++) {
        doc.artboards.setActiveArtboardIndex(i); // Set the active artboard
        var activeArtboardIndex = doc.artboards.getActiveArtboardIndex();
        var activeArtboardRect = doc.artboards[activeArtboardIndex].artboardRect;
        var itemStatuses = saveItemStatuses(); // Save item statuses
        
        // Your script logic starts here
        doc.selectObjectsOnActiveArtboard();
        app.executeMenuCommand("Inverse menu item");
        var selectedItems = doc.selection;
        for (var j = 0; j < selectedItems.length; j++) {
            selectedItems[j].hidden = true;
        }


        // Define settings
        var font = "Arial";
        var fontSize = 7;
        var spacing = 9;
        var isSkipUnused = true;
        var inks = doc.inkList;

        // Process inks for the current artboard
        var x = activeArtboardRect[0] - 15;
        var y = activeArtboardRect[3] + 35;

        for (var j = 0; j < inks.length; j++) {
            var ink = inks[j];
            if (isSkipUnused && ink.inkInfo.printingStatus === InkPrintStatus.DISABLEINK) continue;

            var inkNameText = inkNamesLayer.textFrames.add();
            inkNameText.contents = ink.name.replace("Process ", "");
            inkNameText.textRange.paragraphAttributes.composerEngine = ComposerEngineType.optycaComposer;
            setCharacterAttributes(inkNameText, font, fontSize);
            setInkColor(inkNameText, ink);
            inkNameText.rotate(90, true, true, true, true, Transformation.CENTER);

            // Position ink names for the current artboard
            inkNameText.position = [x - inkNameText.width, y + inkNameText.height];
            y += inkNameText.height + spacing;
        }

        // Restore item statuses after processing
        restoreItemStatuses(itemStatuses);

        // Function definitions
        function setCharacterAttributes(textFrame, font, size) {
            var charAttrs = textFrame.textRange.characterAttributes;
            charAttrs.size = size;
            charAttrs.digitSet = DigitSetType.ARABIC_DIGITS;
        }

        function setInkColor(textFrame, ink) {
            var color;
            switch (ink.inkInfo.kind) {
                case InkType.CYANINK:
                    color = setCMYKColor([100, 0, 0, 0]);
                    break;
                case InkType.MAGENTAINK:
                    color = setCMYKColor([0, 100, 0, 0]);
                    break;
                case InkType.YELLOWINK:
                    color = setCMYKColor([0, 0, 100, 0]);
                    break;
                case InkType.BLACKINK:
                    color = setCMYKColor([0, 0, 0, 100]);
                    break;
                case InkType.CUSTOMINK:
                    try {
                        color = doc.swatches.getByName(ink.name).color;
                    } catch (err) {
                        color = null;
                    }
                    break;
            }
            if (color) {
                textFrame.textRange.characterAttributes.fillColor = color;
            }
        }

        function setCMYKColor(cmyk) {
            var color = new CMYKColor();
            color.cyan = cmyk[0];
            color.magenta = cmyk[1];
            color.yellow = cmyk[2];
            color.black = cmyk[3];
            return color;
        }
    }
}

// Run the main function
applyScriptToEachArtboard();

 

 

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