如何用ODFDOM将OpenOffice Writer文档页眉复制到另一文档?
解决ODFDOM复制OpenOffice Writer页眉到另一文档的问题
问题分析
你尝试的两种方案都存在关键问题:
- 方案一中
insertOdfElement的参数使用错误,该方法需要传入源文档的OdfDocument实例而非强制转换的Document,导致方法未执行任何操作。 - 方案二中直接克隆的节点属于源文档的DOM树,跨文档添加节点必须先通过
importNode导入到目标文档的DOM环境,否则会抛出WRONG_DOCUMENT_ERR异常。
正确实现方法
ODFDOM的TextDocument可以通过getDocument()方法获取底层的org.w3c.dom.Document对象,从而调用importNode完成节点跨文档导入。具体步骤如下:
- 加载源文档(含目标页眉)和目标文档
- 获取源文档的页眉元素和目标文档的页眉容器
- 用目标文档的DOM实例导入源页眉节点
- 清空目标页眉原有内容,将导入后的节点添加进去
- 保存目标文档
完整代码示例
import org.odftoolkit.simple.TextDocument; import org.odftoolkit.simple.header.Header; import org.odftoolkit.simple.style.StyleHeaderElement; import org.w3c.dom.Document; import org.w3c.dom.Node; public class HeaderCopy { public static void main(String[] args) throws Exception { // 加载源文档(仅包含页眉)和目标文档 TextDocument sourceDoc = TextDocument.loadDocument("intestazione.odt"); TextDocument targetDoc = TextDocument.loadDocument("body.odt"); // 获取源文档的页眉元素 Header sourceHeader = sourceDoc.getHeader(); StyleHeaderElement sourceHeaderElement = sourceHeader.getOdfElement(); // 获取目标文档的页眉容器及底层DOM Document Header targetHeader = targetDoc.getHeader(); StyleHeaderElement targetHeaderElement = targetHeader.getOdfElement(); Document targetDom = targetDoc.getDocument(); // 导入源页眉节点到目标文档(deep=true表示导入所有子节点) Node importedHeader = targetDom.importNode(sourceHeaderElement, true); // 清空目标页眉原有内容 while (targetHeaderElement.hasChildNodes()) { targetHeaderElement.removeChild(targetHeaderElement.getFirstChild()); } // 添加导入后的页眉节点到目标容器 targetHeaderElement.appendChild(importedHeader); // 保存修改后的目标文档 targetDoc.save("body_with_new_header.odt"); } }
关键说明
targetDoc.getDocument():获取ODFDOM文档对应的底层DOMDocument实例,这是调用importNode的核心入口。importNode(sourceNode, true):第二个参数设为true会递归导入所有子节点(比如页眉中的表格、文本等),确保完整复制页眉的全部内容。- 用循环删除所有子节点的方式清空目标页眉,比单独删除第一个子节点更通用,适配目标页眉存在多个子元素的场景。
内容的提问来源于stack exchange,提问作者bale
相关产品推荐
相关产品推荐

