InDesign Server脚本:访问矩形内文本框及按XML标签查找
解决InDesign Server中Rectangle内TextFrame访问及XML标签查找问题
一、访问Rectangle内的TextFrame
allPageItems是Page/Spread对象的专属属性,用于获取跨页级别的所有页面元素,Rectangle对象的子元素需要使用pageItems集合来访问。另外需要注意两个细节:
- 如果TextFrame被编组(Group),需要递归遍历Group的
pageItems才能找到 - 若Rectangle处于锁定/隐藏状态,需先解锁(
rectangle.locked = false)或取消隐藏(rectangle.hidden = false),否则无法正常访问子元素
示例代码:
// 假设已获取目标Rectangle对象,命名为targetRect function getTextFramesFromContainer(container) { let textFrames = []; // 遍历容器的pageItems集合 for (let i = 0; i < container.pageItems.length; i++) { let item = container.pageItems[i]; // 匹配TextFrame类型 if (item.constructor.name === "TextFrame") { textFrames.push(item); } // 若为Group,递归查找内部TextFrame else if (item.constructor.name === "Group") { textFrames = textFrames.concat(getTextFramesFromContainer(item)); } } return textFrames; } // 调用函数获取Rectangle内所有TextFrame let rectTextFrames = getTextFramesFromContainer(targetRect); $.writeln(`找到${rectTextFrames.length}个TextFrame`);
二、通过XML标签名称查找TextFrame
可以通过两种高效方式实现:
方式1:遍历所有TextFrame匹配标签
直接遍历文档内所有TextFrame,检查其绑定的XML标签名称:
function findTextFramesByXmlTag(tagName) { let matchingFrames = []; let allTextFrames = app.activeDocument.textFrames.everyItem().getElements(); for (let frame of allTextFrames) { // 确保TextFrame已绑定XML标签且名称匹配 if (frame.xmlTag !== null && frame.xmlTag.name === tagName) { matchingFrames.push(frame); } } return matchingFrames; } // 调用示例:查找xmlTag名为"product_desc"的TextFrame let targetFrames = findTextFramesByXmlTag("product_desc"); $.writeln(`找到${targetFrames.length}个匹配XML标签的TextFrame`);
方式2:通过XML元素关联查找
先定位到对应XML标签的XmlElement,再获取其关联的文本容器(TextFrame):
function findTextFramesByXmlElementTag(tagName) { let matchingFrames = []; let xmlElements = app.activeDocument.xmlElements.everyItem().getElements(); // 递归遍历XML元素树 function traverseXmlElements(xmlElement) { if (xmlElement.markupTag.name === tagName) { // 获取当前XML元素关联的所有文本容器 let containers = xmlElement.associatedTextContainers.everyItem().getElements(); matchingFrames = matchingFrames.concat(containers); } // 遍历子XML元素 for (let child of xmlElement.xmlElements.everyItem().getElements()) { traverseXmlElements(child); } } // 从根XML元素开始遍历 for (let rootElement of xmlElements) { traverseXmlElements(rootElement); } return matchingFrames; } // 调用示例:查找关联XML标签"price_tag"的TextFrame let priceFrames = findTextFramesByXmlElementTag("price_tag"); $.writeln(`找到${priceFrames.length}个匹配的TextFrame`);
内容的提问来源于stack exchange,提问作者momin naveed
相关产品推荐
相关产品推荐

