【问题标题】:Select, adjust and distribute textframes in InDesign [ExtendScript]在 InDesign [ExtendScript] 中选择、调整和分发文本框
【发布时间】:2016-07-13 21:29:46
【问题描述】:

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

  • 选择一些文本框
  • 水平居中选择
  • 水平分布帧
  • 整个例程必须在几页上完成

我的第一个问题是,我只想从未锁定的图层中选择文本框。我找到了几个解决方案,其中选择了所有文本框,即使在锁定层上也是如此。 到目前为止,我发现的唯一解决方案只是从我的未锁定图层 (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); 
        }   
    } 
} 

【问题讨论】:

  • 欢迎!你试过做什么? :)
  • 我添加了一些我已经尝试过的代码@GibboK

标签: javascript adobe-indesign extendscript


【解决方案1】:

通常,选择是用于 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 的解决方案,则需要计算找到的对象组的边界,然后将它们全部偏移,这样整个“选择”就可以居中。

【讨论】:

  • 像魅力一样工作,非常感谢!感谢您提供有关如何在脚本中进行选择的更深入信息。
猜你喜欢
  • 2012-05-31
  • 2017-04-18
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多