自动将文本框放在彼此下方 (JavaScript)
Auto Place Text Frames Below Each Other (JavaScript)
我正在尝试使 inDesign 自动化以从 JSON 文件创建文本框架,其中每条记录都应放置在上述记录正下方的文本框架中。
var tweets_json = '[ {"name":"record_1"}, {"name":"record_2"}, ... ]'; // I have not yet figured out how to import external JSON files, so tor testing this is my current way to go
var tweets = eval("(" + tweets_json + ")");
for ( var t = 0; t < tweets.length; t++ ) {
var newTextFrame = page.textFrames.add();
newTextFrame.textFramePreferences.autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY;
var tweet = tweets[ t ];
newTextFrame.parentStory.texts.item(0).applyParagraphStyle(styleContent, true);
newTextFrame.geometricBounds = [y1,x1,y2,x2]; // Ignore values
newTextFrame.contents = tweet.name;
}
我几天前开始使用 inDesign 脚本编写,文档很难找到我正在寻找的解决方案,尤其是我的 JavaScript 基本知识,所以非常感谢您的帮助!谢谢!
可能是这样的:
var doc = app.activeDocument;
var page = doc.pages[0];
// get JSON data (just as an example)
var tweets_json = '[ {"name":"line1 line2"}, {"name":"line3"}, {"name":"line4, line5"}]';
var tweets = eval("(" + tweets_json + ")");
// set geometric bounds for the first text frame
var x = 0, y = 0; // coordinates of top a left corner of the text frame
var width = 15; // width of the text frame
var min_heigth = 20; // minimal heigth of the text frame
var bottom = min_heigth; // bottom edge of the text frame
var bounds = [y, x, bottom, width];
for (var t = 0; t < tweets.length; t++) {
var tweet = tweets[t];
// create the a new text frame and set its geometric bounds
var newTextFrame = page.textFrames.add();
newTextFrame.geometricBounds = bounds;
// fill the box with a text and apply the style
newTextFrame.contents = tweet.name;
newTextFrame.parentStory.texts[0].applyParagraphStyle(styleContent, true);
// resize the created text box with auto sizing
newTextFrame.textFramePreferences.autoSizingReferencePoint = AutoSizingReferenceEnum.TOP_CENTER_POINT;
newTextFrame.textFramePreferences.autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY;
// set the new geometric bounds for the next text frame
bounds = newTextFrame.geometricBounds; // get the bounds of the created text frame
bottom = bounds[2]; // get the new bottom edge
bounds[0] = bottom; // set the top edge for the next text frame
bounds[2] = bounds[2] + min_heigth; // set the bottom edge for the next text frame
}
结果:
出于教育目的,代码有点冗长。实际上它可以更短。
我正在尝试使 inDesign 自动化以从 JSON 文件创建文本框架,其中每条记录都应放置在上述记录正下方的文本框架中。
var tweets_json = '[ {"name":"record_1"}, {"name":"record_2"}, ... ]'; // I have not yet figured out how to import external JSON files, so tor testing this is my current way to go
var tweets = eval("(" + tweets_json + ")");
for ( var t = 0; t < tweets.length; t++ ) {
var newTextFrame = page.textFrames.add();
newTextFrame.textFramePreferences.autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY;
var tweet = tweets[ t ];
newTextFrame.parentStory.texts.item(0).applyParagraphStyle(styleContent, true);
newTextFrame.geometricBounds = [y1,x1,y2,x2]; // Ignore values
newTextFrame.contents = tweet.name;
}
我几天前开始使用 inDesign 脚本编写,文档很难找到我正在寻找的解决方案,尤其是我的 JavaScript 基本知识,所以非常感谢您的帮助!谢谢!
可能是这样的:
var doc = app.activeDocument;
var page = doc.pages[0];
// get JSON data (just as an example)
var tweets_json = '[ {"name":"line1 line2"}, {"name":"line3"}, {"name":"line4, line5"}]';
var tweets = eval("(" + tweets_json + ")");
// set geometric bounds for the first text frame
var x = 0, y = 0; // coordinates of top a left corner of the text frame
var width = 15; // width of the text frame
var min_heigth = 20; // minimal heigth of the text frame
var bottom = min_heigth; // bottom edge of the text frame
var bounds = [y, x, bottom, width];
for (var t = 0; t < tweets.length; t++) {
var tweet = tweets[t];
// create the a new text frame and set its geometric bounds
var newTextFrame = page.textFrames.add();
newTextFrame.geometricBounds = bounds;
// fill the box with a text and apply the style
newTextFrame.contents = tweet.name;
newTextFrame.parentStory.texts[0].applyParagraphStyle(styleContent, true);
// resize the created text box with auto sizing
newTextFrame.textFramePreferences.autoSizingReferencePoint = AutoSizingReferenceEnum.TOP_CENTER_POINT;
newTextFrame.textFramePreferences.autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY;
// set the new geometric bounds for the next text frame
bounds = newTextFrame.geometricBounds; // get the bounds of the created text frame
bottom = bounds[2]; // get the new bottom edge
bounds[0] = bottom; // set the top edge for the next text frame
bounds[2] = bounds[2] + min_heigth; // set the bottom edge for the next text frame
}
结果:
出于教育目的,代码有点冗长。实际上它可以更短。