Skip to main content
Known Participant
May 2, 2024
Question

Auto Size Text But Opposite in 2024

  • May 2, 2024
  • 2 replies
  • 966 views

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_to/

https://community.adobe.com/t5/illustrator-discussions/auto-change-text-size-to-size-of-text-box/td-p/12518793

 

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.

This topic has been closed for replies.

2 replies

Legend
May 8, 2024

Adobe Express is closer to the behavior you are looking for. That may help.

Inspiring
May 6, 2024
// 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])
}

})()