Select,在 InDesign [ExtendScript] 中调整和分布文本框

Select, adjust and distribute textframes in InDesign [ExtendScript]

我想编写一个脚本来执行以下操作:

我的第一个问题是,我只想 select 来自未锁定图层的文本框。我找到了几个解决方案,其中所有文本框,甚至锁定图层上的文本框,都被 selected。 到目前为止,我发现的唯一解决方案是 select 未锁定层 (app.menuActions.item("$ID/Select &All").invoke();) 中的文本框不提供我可以在之后使用(调整、分发)的对象。

有解决方案吗?


编辑: 我最后一次尝试看起来像这样(对于单个页面,我在测试时没有对多个页面使用循环):

// 'allPageItems' erfasst alle Rahmen, zusätzlich Gruppen und Bilder 
var allObjects = app.activeDocument.layoutWindows[0].activeSpread.allPageItems; 
// eine Schleife durch die Objekte 
for (var n=0; n<allObjects.length; n++) { 
    var curObject = allObjects[n]; 
    // prüfen, ob Textrahmen 
    if (curObject.constructor.name == "TextFrame") { 
        // verankerte Textrahmen ausschliessen 
        if (curObject.parent != "[object Character]") { 
            // zur Auswahl hinzufügen 
            curObject.select(SelectionOptions.ADD_TO); 
        }   
    } 
} 

通常,选择是用于 UI 交互,而不是用于脚本。因此,您应该避免在脚本中处理所有选择内容,并将 textFrames 作为对象收集在一个数组中,然后您可以使用它来执行其他操作。

这应该有效:

#target indesign

var doc = app.activeDocument;
var curSpread = doc.layoutWindows[0].activeSpread;
var spreadItems = curSpread.allPageItems;

var distObjects = [];

// collect all relevant objects in distObjects
for (var i = 0; i < spreadItems.length; i += 1) {
  var si = spreadItems[i];

  // skip if itemLayer is locked
  if (si.itemLayer.locked) continue;

  // skip if item is not a textFrame
  if (!(si instanceof TextFrame)) continue;

  // skip if item is anchored
  if (si.parent.constructor.name === "Character") continue;

  distObjects.push(si);
};

// group all collected objects to center them, then ungroup
var distGroup = curSpread.groups.add(distObjects);
doc.align([distGroup], AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.SPREAD_BOUNDS);
distGroup.ungroup();

// distribute all objects horizontally
doc.distribute(distObjects, DistributeOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.ITEM_BOUNDS);

注意:如果这与较旧的 ID 版本(我相信是 CC2014 之前)一起使用,取消分组后,所有 pageItems 将保留在同一层上。他们移回原始图层的功能是最近才推出的。如果您需要针对旧版 InDesign 的解决方案,则需要计算找到的对象组的边界,然后将它们一一偏移,这样整个 "selection" 就可以居中。