見出し画像

行ごとに散けているテキストをエリア内テキストに統合する(Illustrator)

好ましくありませんが、PDFをIllustratorでひらくと、テキストが行ごとに散けてしまうことがあります。

標準機能のみ

Illustratorの標準機能なら、次の手順で実現できます。

  1. テキストをカット

  2. 文字ツールでテキストエリアを作成し、ペースト

  3. 行間や禁則を調整

  4. トラッキングを調整

トラッキングを調整

PDFから戻したテキストの場合、カーニングがトラッキングに変換されていることがあるため、⌘ + option + Qキーでトラッキングを解除します。

または、⌘ + option + Kキーで[トラッキング]をハイライトし、「0」を入力します。

スクリプトを使う場合

それぞれの作業はスクリプトを使っても可能です。

自分の場合、「文字ツールでテキストエリアを作成し」が非常にストレスですし、200箇所あるとしたら厳しいですよね。

エリア内文字に変換

複数のポイント文字を選択し、右側に伸びている線の先端の○をダブルクリックします。

スクリプトで変換することもできます。

1つのオブジェクトに統合

Gorolib Designさんのスクリプトを使って、1つのオブジェクトに統合できます。

改行を削除

三階ラボさんの「A02: 全改行を削除」を使います。

まとめる

ChatGPT謹製のスクリプトです。次の操作をまとめて行います。

  • ポイント文字をエリア内文字に変換

  • テキストを統合(連結)

  • 改行を削除

  • エリア内文字の高さを調整

  • トラッキングを調整

// Adobe Illustrator用スクリプト:テキストフレームの自動調整
#target illustrator

function main() {
    if (app.documents.length == 0) {
        alert('ドキュメントが開いていません。');
        return;
    }

    var doc = app.activeDocument;
    var sel = doc.selection;
    if (sel.length == 0) {
        alert('何も選択されていません。');
        return;
    }

    // エリア内文字に変換
    for (var i = 0; i < sel.length; i++) {
        if (sel[i].typename == "TextFrame" && (sel[i].kind == TextType.POINTTEXT || sel[i].kind == TextType.PATHTEXT)) {
            var cLayer = sel[i].layer;
            var rect = cLayer.pathItems.rectangle(sel[i].top, sel[i].left, sel[i].width, sel[i].height);
            var tFrame = cLayer.textFrames.areaText(rect);
            sel[i].textRange.move(tFrame, ElementPlacement.PLACEATEND);
            sel[i].remove();
            sel[i] = tFrame;
        }
    }

    // 選択されたフレームのみをリフレッシュ
    doc.selection = sel;

    // テキストフレームの統合と高さ調整
    var totalHeight = 0;
    var originalSizes = [];
    var textFrames = [];
    for (var i = 0; i < sel.length; i++) {
        if (sel[i].typename === 'TextFrame') {
            textFrames.push(sel[i]);
            totalHeight += sel[i].height;  // 高さの合計
            originalSizes.push(sel[i].textRange.characterAttributes.size); // オリジナルの文字サイズを記録
        }
    }

    var baseFrame;
    if (textFrames.length > 1) {
        textFrames.sort(function (a, b) { // 位置に基づいてソート
            return (b.position[1] - a.position[1]) || (a.position[0] - b.position[0]);
        });
        baseFrame = textFrames[0];
        for (var i = 1; i < textFrames.length; i++) {
            baseFrame.contents += textFrames[i].contents; // スペースなしで連結
            textFrames[i].remove();
        }
        baseFrame.height = totalHeight;  // 合計の高さを設定
    } else if (textFrames.length == 1) {
        baseFrame = textFrames[0];
    }

    // マージ後にオリジナルの文字サイズに戻す
    if (baseFrame && originalSizes.length > 0) {
        var totalSize = 0;
        for (var i = 0; i < originalSizes.length; i++) {
            totalSize += originalSizes[i];
        }
        var avgSize = totalSize / originalSizes.length;
        baseFrame.textRange.characterAttributes.size = avgSize;
        baseFrame.textRange.characterAttributes.horizontalScale = 100; // 水平比率を100%に設定
        baseFrame.textRange.characterAttributes.verticalScale = 100;   // 垂直比率を100%に設定
        baseFrame.textRange.characterAttributes.tracking = 0;          // トラッキングを0に設定
        // 禁則処理を設定
        for (var j = 0; j < baseFrame.textRange.paragraphs.length; j++) {
            baseFrame.textRange.paragraphs[j].paragraphAttributes.kinsoku = "hard"; // ここに適切な値を設定
        }
    }

    // 改行を削除
    if (baseFrame) {
        baseFrame.contents = baseFrame.contents.replace(/\r/g, ''); // 改行をスペースなしで削除
    }

    // 統合されたテキストフレームを選択
    if (baseFrame) {
        doc.selection = [baseFrame];
    }
}

main();

禁則

最終的に禁則処理を設定したいところですが、スクリプトではRead Onlyのため、変更できません。

アクション

アクションなら調整できますが、[段落]パネル上ではアップデートされないことがあります。

/version 3
/name [ 12
	e69687e5ad97e7b584e381bf
]
/isOpen 1
/actionCount 1
/action-1 {
	/name [ 15
		e7a681e58987efbc9ae5bcb1e38184
	]
	/keyIndex 0
	/colorIndex 0
	/isOpen 1
	/eventCount 1
	/event-1 {
		/useRulersIn1stQuadrant 0
		/internalName (adobe_SLOParagraphPalette)
		/localizedName [ 6
			e6aeb5e890bd
		]
		/isOpen 1
		/isOn 1
		/hasDialog 0
		/parameterCount 1
		/parameter-1 {
			/key 1802726261
			/showInPalette 4294967295
			/type (ustring)
			/value [ 5
				536f667400
			]
		}
	}
}

Keyboard Maestroで仕込んでおくとよさそうです。

まとめ


ここから先は

0字

¥ 100

定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5