在InDesign [ExtendScript]中选择,调整和分发文本框架

时间:2016-07-13 08:22:28

标签: javascript adobe-indesign extendscript

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

  • 选择一些textframes
  • 水平选择中心
  • 水平分发框架
  • 整个例程必须在几页上完成

我的第一个问题是,我只想从未锁定的图层中选择文本框架。我找到了几种解决方案,其中所有文本框架,甚至是锁定图层都被选中。 到目前为止我发现的唯一解决方案就是从我的未锁定图层(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); 
        }   
    } 
} 

1 个答案:

答案 0 :(得分:2)

通常,选择是用于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之前),在取消分组后,所有pageItem将保留在同一层上。最近才介绍了他们返回原始图层的功能。如果你需要一个较旧的InDesign版本的解决方案,你需要计算你找到的对象组的边界,然后逐个抵消它们,所以整个&#34;选择&#34;可以集中精力。