Skip to main content
Siddalingayya
Known Participant
September 17, 2026
Question

Regadring InDesign 2025 version

  • September 17, 2026
  • 13 replies
  • 65 views

I have a suggestion regarding InDesign (version 20.5.3.x64).

Currently, the feature for overset text displays the character count and percentage. However, it would be much more helpful to also have a word count option. Many vernacular languages, including Kannada (which I use for a newspaper publication), rely primarily on word count rather than character count.

Would it be possible to add a word count indicator for overset text in a future update?

Thank you for your time and consideration.

Best regards,
SIDDALINGAYYA B. KANAKALMATH

Chief Graphic Artist Prajavani, Bengaluru

    13 replies

    Siddalingayya
    Known Participant
    September 19, 2026
    Hi,
    Kindly have a look at the screenshot. I am asking about the overshooted text(Words) at the botttom of the t\ext box. I know the preflight and info panel. Where I have marked in the screen shot their the word count is more helpfull for us. I think you got my idea...😊
     

     

    Community Expert
    September 19, 2026

    The preflight panel can show the overset text frames and also report how many characters are overset. That is a character count and not a word count. 

    You can also click inside a text frame to show how many overset words there are in the info panel but that’s one frame at a time. 

     

    There’s a plugin here

    https://rorohiko.com/wordpress/indesign-downloads/framereporter-for-indesign/

     

    I’ve been playing with a script development for this for a while. I found a few online but didn’t do everything required.

     

    It might not be the best idea in the world but hey if it’s fine for me I don’t really make other considerations. 

    The information is there in InDesign I just put it at the top of the frame in a non-printing layer. 

    #target "InDesign"
    #targetengine "OversetWordCount"
    //DESCRIPTION:Count overset words, locate their frames, and show nonprinting counters.

    /* Overset Word Count v2.0 | 2026-09-19 | Adobe InDesign ExtendScript
    Run with a document open. Refresh after editing text; Close leaves counters in place.
    Uncheck the counter option to remove them. Each document operation is one Undo step.
    Counts use InDesign Word objects, including words partly beyond the visible boundary.
    Shares v1's palette key and badge label so switching versions replaces existing counters.
    */
    (function () {
    // 1. SETTINGS & SESSION: keep editable values together and only one palette open.
    var SETTINGS = {
    windowKey: "oversetWordCountWindow", badgeLabel: "OversetWordCountBadgeV1",
    layerName: "Overset Word Counters", colorName: "Overset Counter Red",
    width: 82, height: 15, gap: 2, pointSize: 8, leading: 10, rgb: [220, 40, 40]
    };
    if (!app.documents.length) {
    alert("Open an InDesign document, then run OversetWordCount_v2.jsx again.");
    return;
    }
    try { if ($.global[SETTINGS.windowKey]) $.global[SETTINGS.windowKey].close(); }
    catch (ignoreOldWindow) {}
    var doc = app.activeDocument, results = [];

    // 2. PALETTE: retain the familiar controls; layout is calculated only at startup.
    var win = new Window("palette", "Overset Word Count v2", undefined, { resizeable: true });
    $.global[SETTINGS.windowKey] = win;
    win.orientation = "column";
    win.alignChildren = ["fill", "top"];
    win.spacing = 8;
    win.margins = 12;
    var summary = win.add("statictext", undefined, "Scanning document...");
    var list = win.add("listbox", undefined, [], {
    multiselect: false, numberOfColumns: 3, showHeaders: true,
    columnTitles: ["Page", "Story", "Overset words"], columnWidths: [90, 180, 110]
    });
    list.preferredSize = [420, 230];
    list.alignment = ["fill", "fill"];
    win.add("statictext", undefined, "Double-click a result, or select it and choose Go to frame.");
    var showBadges = win.add("checkbox", undefined, "Show nonprinting counters above overset frames");
    showBadges.value = true;
    var buttons = win.add("group");
    buttons.alignment = ["right", "top"];
    var refresh = buttons.add("button", undefined, "Refresh");
    var go = buttons.add("button", undefined, "Go to frame");
    var close = buttons.add("button", undefined, "Close");
    go.enabled = false;

    // 3. HELPERS: shared wording, safe page lookup, and one named Undo step per action.
    function quantity(count, singular, plural) {
    return count + " " + (count === 1 ? singular : (plural || singular + "s"));
    }
    function pageOf(item) {
    try { if (item.parentPage && item.parentPage.isValid) return item.parentPage; }
    catch (ignorePage) {}
    return null;
    }
    function storyName(story, number) {
    var name = "Story " + number;
    try { name += " (ID " + story.id + ")"; } catch (ignoreID) {}
    return name;
    }
    function singleUndo(action, name) {
    app.doScript(action, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, name);
    }
    function spreadOf(item) {
    var page = pageOf(item), owner;
    if (page) return page.parent;
    try {
    for (owner = item.parent; owner && owner.isValid; owner = owner.parent) {
    if (/^(Spread|MasterSpread)$/.test(owner.constructor.name)) return owner;
    }
    } catch (ignoreOwner) {}
    return null;
    }

    // 4. WORD COUNT: walk backwards and stop at the first entirely visible word.
    // The final container's last insertion point marks the visible/overset boundary.
    function oversetWords(story, boundary) {
    var words = story.words, count = 0, end;
    for (var i = words.length - 1; i >= 0; i--) {
    try { end = words[i].insertionPoints[-1].index; }
    catch (ignoreWord) { continue; }
    if (end <= boundary) break;
    count++;
    }
    return count;
    }

    // 5. COUNTERS: remove only script-labelled items; build red, nonprinting badges.
    function removeBadges() {
    if (!doc.isValid) return;
    var items = doc.allPageItems;
    for (var i = items.length - 1; i >= 0; i--) {
    try { if (items[i].label === SETTINGS.badgeLabel) items[i].remove(); }
    catch (ignoreRemoval) {}
    }
    }
    function createBadge(result, layer, color, none, paper) {
    var badge = null, spread = spreadOf(result.container);
    if (!spread) return false;
    try {
    var bounds = result.container.geometricBounds, top = Number(bounds[0]), right = Number(bounds[3]);
    badge = spread.textFrames.add(layer);
    badge.label = SETTINGS.badgeLabel;
    badge.nonprinting = true;
    badge.properties = {
    geometricBounds: [top - SETTINGS.height - SETTINGS.gap, right - SETTINGS.width,
    top - SETTINGS.gap, right],
    contents: quantity(result.wordCount, "overset word"), fillColor: color, strokeColor: none
    };
    badge.textFramePreferences.properties = {
    insetSpacing: [1, 3, 1, 3], verticalJustification: VerticalJustification.CENTER_ALIGN
    };
    badge.texts[0].properties = {
    fillColor: paper, pointSize: SETTINGS.pointSize, leading: SETTINGS.leading,
    justification: Justification.CENTER_ALIGN
    };
    return true;
    } catch (badgeError) {
    // Do not leave an unfinished text frame if a formatting operation fails.
    try { if (badge && badge.isValid) badge.remove(); } catch (ignoreCleanup) {}
    return false;
    }
    }
    function createBadges() {
    if (!results.length) return 0;
    var oldUnit = app.scriptPreferences.measurementUnit, oldLayer = doc.activeLayer, count = 0;
    try {
    // Set units and resolve shared resources once for the whole batch.
    app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS;
    var layer = doc.layers.itemByName(SETTINGS.layerName);
    if (!layer.isValid) layer = doc.layers.add({ name: SETTINGS.layerName });
    layer.properties = { visible: true, locked: false, printable: false };
    var color = doc.colors.itemByName(SETTINGS.colorName);
    if (!color.isValid) color = doc.colors.add({
    name: SETTINGS.colorName, model: ColorModel.PROCESS,
    space: ColorSpace.RGB, colorValue: SETTINGS.rgb
    });
    var none = doc.swatches.itemByName("[None]"), paper = doc.swatches.itemByName("[Paper]");
    for (var i = 0; i < results.length; i++) {
    if (createBadge(results[i], layer, color, none, paper)) count++;
    }
    } finally {
    app.scriptPreferences.measurementUnit = oldUnit;
    if (oldLayer.isValid) doc.activeLayer = oldLayer;
    }
    return count;
    }

    // 6. SCAN & REPORT: remove badge stories before taking a snapshot of real stories.
    function scan() {
    results = [];
    list.removeAll();
    go.enabled = false;
    if (!doc.isValid) {
    summary.text = "The document used for this report is no longer open.";
    return;
    }
    removeBadges();
    var stories = doc.stories.everyItem().getElements(), total = 0;
    for (var i = 0; i < stories.length; i++) {
    var story = stories[i];
    if (!story.isValid || !story.overflows) continue;
    var containers = story.textContainers;
    if (!containers.length) continue;
    var frame = containers[containers.length - 1], boundary;
    try { boundary = frame.insertionPoints[-1].index; }
    catch (ignoreContainer) { continue; }
    var count = oversetWords(story, boundary), page = pageOf(frame);
    results.push({ container: frame, wordCount: count });
    total += count;
    var row = list.add("item", page ? page.name : "Pasteboard");
    row.subItems[0].text = storyName(story, i + 1);
    row.subItems[1].text = String(count);
    row.resultIndex = results.length - 1;
    }
    var badges = showBadges.value ? createBadges() : 0;
    summary.text = results.length ?
    quantity(results.length, "overset story", "overset stories") + ", " +
    quantity(total, "overset word") + ". " + quantity(badges, "layout counter") + "." :
    "No overset stories found.";
    }

    // 7. NAVIGATION: use the report's original document, even if another is active.
    function goToFrame() {
    if (!list.selection) return;
    var result = results[list.selection.resultIndex];
    if (!result || !result.container || !result.container.isValid) {
    alert("That text frame is no longer available. Choose Refresh to scan again.");
    return;
    }
    try {
    if (!doc.layoutWindows.length) {
    alert("The document has no open layout window.");
    return;
    }
    var view = doc.layoutWindows[0], page = pageOf(result.container);
    view.bringToFront();
    if (page) view.activePage = page;
    view.select(result.container);
    try { view.zoom(page ? ZoomOptions.FIT_PAGE : ZoomOptions.SHOW_PASTEBOARD); }
    catch (ignoreZoom) {}
    } catch (navigationError) {
    alert("InDesign could not select that text frame.\r" + navigationError);
    }
    }

    // 8. EVENTS & STARTUP: callbacks share the undo helper; resizing avoids a full relayout.
    list.onChange = function () { go.enabled = list.selection !== null; };
    list.onDoubleClick = go.onClick = goToFrame;
    refresh.onClick = function () { singleUndo(scan, "Refresh Overset Word Counters"); };
    showBadges.onClick = function () {
    if (showBadges.value) { refresh.onClick(); return; }
    singleUndo(removeBadges, "Remove Overset Word Counters");
    summary.text = results.length ?
    quantity(results.length, "overset story", "overset stories") + ". Layout counters hidden." :
    "No overset stories found.";
    };
    close.onClick = function () { win.close(); };
    win.onResizing = win.onResize = function () { this.layout.resize(); };
    win.onClose = function () { $.global[SETTINGS.windowKey] = null; };
    singleUndo(scan, "Create Overset Word Counters");
    // Full relayout after showing can hide the button row on some Windows configurations.
    win.layout.layout(true);
    win.center();
    win.show();
    })();



     

    leo.r
    Community Expert
    Community Expert
    September 18, 2026
    I have a suggestion regarding InDesign (version 20.5.3.x64).


    Just in case, in addition to all other advice: As you probably know anyway, nothing will be added to InDesign 2025 anymore. Any new features will be added to the current InDesign version only (InDesign 2026 now and up further).

    Siddalingayya
    Known Participant
    September 18, 2026

    Hi leo.r
    I understand that this cannot be done in the 2025 version, but would it be possible to work on the latest version instead?

    I suggested this because it would be beneficial for the team to address the 2025 version now, and we can always update to the latest version later as needed.

     

    Best

    Siddalingayya

    leo.r
    Community Expert
    Community Expert
    September 18, 2026
    I understand that this cannot be done in the 2025 version, but would it be possible to work on the latest version instead?


    Like I mentioned, it can be achieved with a custom script right now (in any version). Adobe can definitely consider implementing it as a built-in option in InDesign itself, but it may take years to implement (if ever).​​​​​​

    Mike Witherell
    Community Expert
    Community Expert
    September 17, 2026

    Hi SIDDALINGAYYA ,

    When I use the Info panel, and have a Type tool inserted in text, it reports characters, words, lines, and paragraphs. Does it not work this way for you?

    Mike Witherell
    Siddalingayya
    Known Participant
    September 17, 2026

    Hi Mike Witherell

    Selecting text and opening the Info panel (F8 key) to view details is understandable, but checking it manually for every story is not practical for our workflow, as we produce a daily newspaper of over 200 pages.

    Instead of showing automatic overshoot details, it would be much more helpful if that option displayed the word count directly. What you say?

     

    Siddalingayya B. Kanakalmath

    leo.r
    Community Expert
    Community Expert
    September 18, 2026

    This can be achieved with a custom script. Also, will take a few hours as opposed to a few years of waiting for this option to be implemented by Adobe.

    Community Expert
    September 17, 2026

    Hi ​@Siddalingayya, feature requests are better made at https://indesign.uservoice.com/. Check if something exists then upvote it. More the number of upvotes more would be the chances of the InDesign engineering team to pick it up.

    -Manan
    Siddalingayya
    Known Participant
    September 17, 2026

    Hi Manan,

    I am writing to advocate for better support for Kannada vernacular language in InDesign.

    While the majority of global users rely on English, regional language users should not be overlooked. Although our user base may be smaller, proper support for local languages is critical for our work.

    I understand that feature prioritization often depends on the number of upvotes, but I request the InDesign engineering team to consider the needs of Kannada content creators…

     

    Siddalingayya B. Kanakalmath

    nik.m
    Community Manager
    Community Manager
    September 17, 2026

    Hi @Siddalindayya, thanks for reaching out and sharing more information.

    As Manan suggested, please share your request on UserVoice, as the product team monitors Bugs and Feature requests through that platform.

    You can also look at a similar feature request here: https://adobe.ly/4xwcYIu


    Thanks,
    Nikunj