如何让Text Adornment信息存入IDML?InDesign SDK技术问询
InDesign SDK TextAdornment的IDML持久化解决方案
一、如何让自定义TextAdornment信息存入IDML
BasicTextAdornment示例未实现IDML持久化能力,需通过以下步骤补充:
- 实现IPersist接口
自定义TextAdornment类必须继承并实现IPersist接口,重写Write和Read方法,完成自定义属性的序列化与反序列化:
class MyCustomTextAdornment : public TextAdornment, public IPersist { // ... 类的其他核心逻辑实现 void Write(IDOMXMLWriter* writer, IDocument* doc) const override { // 将自定义属性写入XML节点,例如下划线状态、颜色配置 writer->WriteAttribute("CustomUnderline", kTrue); writer->WriteAttribute("UnderlineColor", "Color/CustomRed"); } void Read(IDOMXMLReader* reader, IDocument* doc) override { // 从XML节点读取属性并恢复到对象 bool isUnderlined = reader->GetAttributeAsBoolean("CustomUnderline", kFalse); if (isUnderlined) { // 还原下划线样式的逻辑 } } };
- 注册持久化类型
在插件初始化阶段,将自定义TextAdornment类型注册到InDesign的IDML持久化系统,确保导出流程能识别并处理该类型:
// 关联类ID与对象创建方法,注册持久化处理器 PersistManager::AddPersistHandler(kMyCustomTextAdornmentClassID, MyCustomTextAdornment::Create);
- 绑定文本流导出链路
TextAdornment依附于文本流存在,需确保IDML导出文本内容时,自定义装饰会被遍历并触发Write方法。可通过监听ITextModel的导出事件,或确保TextAdornment正确关联到目标字符/段落范围,纳入核心文本处理流程。
二、为什么kTARubyXXXBoss这类TextAdornment能被IDML持久化
kTARubyXXXBoss属于InDesign内置文本装饰特性,具备官方完整的持久化支持:
- Adobe已在IDML规范中定义了Ruby装饰对应的XML节点格式,导出时会自动生成符合规范的标签;
- 官方实现了Ruby类TextAdornment的
IPersist接口,在IDML导出/导入时自动完成属性的序列化与反序列化; - Ruby装饰与文本流的绑定逻辑已集成到InDesign核心文本处理链路,导出IDML时会被自动纳入文本节点的处理流程,无需额外配置。
补充说明
你提到的下划线属于字符样式属性,直接存储在CharacterStyleRange节点中;而TextAdornment是独立的文本附加对象,需通过IPersist接口将自定义属性写入对应的XML节点(可扩展CharacterStyleRange或新增自定义节点),才能在IDML中保留并还原。
内容的提问来源于stack exchange,提问作者huaraoteng
相关产品推荐
相关产品推荐

