Text nur verzerren/verkleinern, wenn er für den Textbereich in Illustrator zu groß ist

Ich erstelle ein mehrsprachiges PDF in Illustrator mit Variablen und möchte einzeilige Textbereichsfelder zur Steuerung des Typs verwenden. In einigen Sprachen wird der Text jedoch sehr lang sein. Kann ich eine bestimmte Schriftgröße für den Textbereich festlegen und dann, wenn der Text über seinen Rahmen hinausgeht, ihn verzerren, verkleinern oder die Laufweite verringern lassen, damit er passt? Ich möchte nicht, dass es in eine neue Zeile umbricht.

Ich verwende ExtendScript, um dies in vielen Schritten zu tun, und stoße immer wieder auf Einschränkungen. Um die Breite des tatsächlichen Textes zu erhalten, konvertiere ich ihn in Punktschrift, convertAreaObjectToPointObject()was funktioniert, wenn der Text kleiner als sein Feld ist. Wenn es überläuft, schneidet die Methode immer genau wie ihr GUI-Äquivalent unter Type > Convert to Point Type ab.

Durch programmgesteuertes Erweitern der Bereichsschriftbreite vor dem Konvertieren in Punkt, um ein Abschneiden zu vermeiden, wird .widthdie Schrift anstelle des umgebenden Rahmens gestreckt. Gibt es eine andere Methode, die ich verwenden sollte, die das Greifen der Erweiterungskante des Flächentyps simuliert?

Antworten (2)

Mit den unhandlichen Zeichen und Linien und Absatzskriptobjekten können Sie mit einer Methode überprüfen, ob der Bereichstext überschrieben ist. Hier in diesem Skript gibt es eine Funktion, die es zusammenfasst.

function isOverset(textBox) {
    if (textBox.lines.length > 0) {
        if (textBox.lines[0].characters.length < textBox.characters.length) {
            return true;
        } else {
            return false;
        }
    } else if (textBox.characters.length > 0) {
        return true;
    }
}

Außerdem habe ich diesen LinkedIn-Artikel zu diesem Thema für alle geschrieben, die ihn nützlich finden.

Wirklich schöne, einfache Lösung. Danke schön.

Dies scheint eine sehr hässliche Lösung zu sein, daher bin ich gespannt auf Verbesserungen. Es stellte sich heraus, dass ich das widthvon setzen textPathmusste, nicht das textFrame. Ich hatte auch viele unbekannte Probleme mit der Anwendung .convertPointObjectToAreaObject()und der Umkehrung von Variablen, als ob sie die Referenz verlieren würden.

function shrink_all_text_frames_to_fit (layer_name) {
    var currentLayer = app.activeDocument.layers[layer_name];
    for (var i = 1; i < currentLayer.textFrames.length; i++) {
        currentLayer.textFrames[i].textRange.characterAttributes.horizontalScale = 100; // reset so the script can be run multiple times
        while (check_text_overflow(currentLayer, i))
            shrinkAndCheckSize(currentLayer, i);
    }
}

function check_text_overflow(layer, frame_number) {
    var save_box_fontsize = layer.textFrames[frame_number].textRange.characterAttributes.size;
    var save_box_width = layer.textFrames[frame_number].width;
    var save_box_height = layer.textFrames[frame_number].height;
    var save_horizontal_scale = layer.textFrames[frame_number].textRange.characterAttributes.horizontalScale;
    layer.textFrames[frame_number].textPath.width = 200; // Set high to avoid the next line clipping text
    layer.textFrames[frame_number].convertAreaObjectToPointObject(); // Convert to point type to measure width
    var text_width = layer.textFrames[frame_number].width;
    layer.textFrames[frame_number].convertPointObjectToAreaObject(); // Convert back to area and restore size
    layer.textFrames[frame_number].width = save_box_width;
    layer.textFrames[frame_number].height = save_box_height;
    layer.textFrames[frame_number].textRange.characterAttributes.horizontalScale = save_horizontal_scale;
    layer.textFrames[frame_number].textRange.characterAttributes.size = save_box_fontsize;
    return (text_width > save_box_width);
}

function shrinkAndCheckSize(layer, frame_number) {
    layer.textFrames[frame_number].textRange.characterAttributes.horizontalScale -= 5;
}

shrink_all_text_frames_to_fit("Layer Name");