行ごとに散けているテキストをエリア内テキストに統合する(Illustrator)
好ましくありませんが、PDFをIllustratorでひらくと、テキストが行ごとに散けてしまうことがあります。
標準機能のみ
Illustratorの標準機能なら、次の手順で実現できます。
テキストをカット
文字ツールでテキストエリアを作成し、ペースト
行間や禁則を調整
トラッキングを調整
トラッキングを調整
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で仕込んでおくとよさそうです。
まとめ
ここから先は
¥ 100
定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5