Copy link to clipboard
Copied
There is a feature where you can automatically size the text-box to the text under Area Type Options > Auto Size.
Is there a feature that does exactly this but the opposite? Meaning the text changes size to fit the text-box. I've laid out an example of what I mean.
The reason I ask is whenever I lay out text, I already have an idea of how big I want the box to be. Once I put in text, then I have to waste time figuring out a font-size that makes all the text fit the box appropriately. It would be a God Send if there were an Auto Size feature for changing text-size and not the text-box.
Other Threads With My Issue Please Read
https://old.reddit.com/r/AdobeIllustrator/comments/n5b3n4/autosize_text_to_fit_textframe_i_found_how...
I'm hoping after 2-3 years someone has created a script or an update implements this.
Please do not hesitate to ask for clarification.
Copy link to clipboard
Copied
// fit_text_to_frame.jsx
// resizes text larger/smaller to fit the selected text frame(s)
// (the text frame must be fully selected; point text and non-text items are ignored)
// current limitations: this assumes all characters are same size; leading is not adjusted
(function() {
var MIN_SIZE = 1, MAX_SIZE = 1296 // practical limits, in pts
var MIN_STEP = 0.1 // the smaller this is, the more precise (and slower) the fit
function fitTextToFrame(textFrame) {
// textFrame : TextFrame -- path or area text
if (textFrame.typename !== 'TextFrame' || textFrame.kind === TextType.POINTTEXT) { return }
var length = textFrame.contents.replace(/\s+$/, "").length // length of printable text (ignores trailing whitespace)
if (length === 0) { return } // skip empty text frame
// overflow checker; this checks length of printable text to index of last visible character in frame
var hasOverflow = function() {
var lastLine = textFrame.lines[textFrame.lines.length-1]
if (!lastLine) { return true } // no lines visible (frame is too small)
var visibleLength = (lastLine.characters[0].characterOffset + lastLine.length - 1)
return visibleLength < length
}
// word count checker; assuming no overflow, this detects large words that are force-wrapped onto >1 line
var hasSplitWords = function() {
var wc = 0
for (var i = 0; i < textFrame.lines.length; i++) {
wc += textFrame.lines[i].words.length
}
return wc > textFrame.words.length
}
// (caution: do not use JS’s +=, -=, *=, /= operators on AI properties as JSX doesn't handle them right)
var style = textFrame.textRange.characterAttributes
var size = style.size
// 1. resize text so it is just overflowing
while ((hasOverflow() || hasSplitWords()) && size >= MIN_SIZE * 2) { // decrease size until no overflow
size /= 2.0
style.size = size
}
if ((hasOverflow() || hasSplitWords())) { return } // hit minimum size and it's still overflowing, so give up
while (!(hasOverflow() || hasSplitWords()) && size <= MAX_SIZE / 2) { // increase size until text overflows
size *= 2.0
style.size = size
}
if (!(hasOverflow() || hasSplitWords())) { return } // hit maximum size and it hasn't overflowed, so give up
// 2. now do binary search for the largest size that will just fit the text frame
var step = size / 2.0
while (step > MIN_STEP) {
step /= 2.0
size += (hasOverflow() || hasSplitWords()) ? -step : step
style.size = size
}
// 3. if text ends up overflowing after last step, step it back down
while ((hasOverflow() || hasSplitWords())) {
style.size = size - step
step *= 1.1
}
}
var items = app.activeDocument.selection
for (var i = 0; i < items.length; i++) { // iterate over currently selected items
fitTextToFrame(items[i])
}
})()
Copy link to clipboard
Copied
Adobe Express is closer to the behavior you are looking for. That may help.