|
#target Illustrator |
|
|
|
/* Convert rich blacks to flat black |
|
* Finds items with enhanced blacks in the artwork and changes their color to flat black |
|
* |
|
* No prompts because it should work inside a Batch action! |
|
* TODO: Error Target layer cannot be modified when another layer exists and is locked or smth |
|
*/ |
|
|
|
// Black limit |
|
// All colors with more than this amount of K and coverage will be flattened |
|
// EDIT HERE |
|
var maxBlack = 90; |
|
var minCoverage = 300; |
|
|
|
(function init() { |
|
if(documents.length < 1) { |
|
return; |
|
} else { |
|
main(); |
|
} |
|
})(); |
|
|
|
function main() { |
|
var docRef = app.activeDocument; |
|
|
|
with (docRef) { |
|
|
|
// Stop if document isn't CMYK |
|
if(documentColorSpace !== DocumentColorSpace.CMYK) { |
|
alert("Document isn't CMYK."); |
|
return; |
|
} |
|
|
|
// Extend CMYKColor object with coverage calculation method |
|
CMYKColor.getCoverage = function(color) { |
|
return color.black + color.cyan + color.magenta + color.yellow; |
|
}; |
|
|
|
// Create flat black Color |
|
flatBlack = new CMYKColor(); |
|
flatBlack.black = 100; |
|
|
|
// Iterate through all path items |
|
for (var i = 0; i < pathItems.length; i++) { |
|
with (pathItems[i]) { |
|
if (filled == true && fillColor instanceof CMYKColor) { |
|
// If black exceeds maxBlack clip it to flat black (100%K) |
|
if (fillColor.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) fillColor = flatBlack; |
|
} |
|
if (stroked == true && strokeColor instanceof CMYKColor) { |
|
if (strokeColor.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) strokeColor = flatBlack; |
|
} |
|
if (filled == true && fillColor instanceof SpotColor) { |
|
if (fillColor.spot.color.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) fillColor.spot.color = flatBlack; |
|
} |
|
if (stroked == true && strokeColor instanceof SpotColor) { |
|
if (strokeColor.spot.color.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) strokeColor.spot.color = flatBlack; |
|
} |
|
} |
|
} |
|
|
|
// Iterate through text items as well |
|
for (var j = 0; j < stories.length; j++) { |
|
with (stories[j]) { |
|
for (var k = 0; k < characters.length; k++) { |
|
with (characters[k].characterAttributes) { |
|
if (fillColor instanceof CMYKColor) { |
|
if (fillColor.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) fillColor = flatBlack; |
|
} |
|
if (strokeColor instanceof CMYKColor) { |
|
if (strokeColor.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) strokeColor = flatBlack; |
|
} |
|
if (fillColor instanceof SpotColor) { |
|
if (fillColor.spot.color.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) fillColor.spot.color = flatBlack; |
|
} |
|
if (strokeColor instanceof SpotColor) { |
|
if (strokeColor.spot.color.black >= maxBlack && CMYKColor.getCoverage(fillColor) >= minCoverage) strokeColor.spot.color = flatBlack; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
} |
|
} |
When trying to run the script I get the following error:
I use Adobe Illustrator CC 2017.1.0 Release (21.1.0).
edit: somehow the getCoverage function is not being added to CMYKColor. I got it working by moving the function to CMYKColor.getCoverage (static function) and change the calls.