Java Docx4J从docx文件中获取页眉/页脚元素并修改它们

Java Docx4J从docx文件中获取页眉/页脚元素并修改它们,java,xml,docx,docx4j,Java,Xml,Docx,Docx4j,我正在使用Docx4J修改docx模板,并将值替换模板中预定义的占位符 到目前为止,我已经成功地找到并替换了段落和文本、表格、图像等,但还没有成功地找到文档的页眉和/或页脚元素 我正在使用 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); wordMLPackage.getMainDocumentPart(); 搜索模板中的元素 对于您的

我正在使用Docx4J修改docx模板,并将值替换模板中预定义的占位符

到目前为止,我已经成功地找到并替换了段落和文本、表格、图像等,但还没有成功地找到文档的页眉和/或页脚元素

我正在使用

WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));
wordMLPackage.getMainDocumentPart(); 

搜索模板中的元素

对于您的应用程序,您可以模拟第145行的代码


第124行采用了类似的方法,这就是我如何设法替换页脚上的键槽(在Java中,没有XML)。我缺少的是:

JaxbXmlPart part = (JaxbXmlPart) relationshipPart.getPart(r);
来自前面提到的源代码,在第410行中说明。谢谢你

publicstaticvoidreplacementfromfooter(WordprocessingMLPackage模板、字符串nameplace、字符串占位符、字符串newValue)抛出docx4jeexception{
列表结果=新建ArrayList();
RelationshipsPart relationshipPart=template.getMainDocumentPart().getRelationshipsPart();
列表关系=relationshipPart.getRelationships().getRelationship()
for(关系r:关系){
if(r.getType().equals(nameplace)){
JaxbXmlPart=(JaxbXmlPart)relationshipPart.getPart(r);
List Text=getAllegementsFromObject(part.getContents(),Text.class);
replaceTextElement(文本、占位符、newValue);
}
}
返回结果;
}
私有静态列表GetAllegementsFromObject(对象对象,类到搜索){
列表结果=新建ArrayList();
if(JAXBELENT的obj实例){
obj=((JAXBElement)obj.getValue();
}
if(obj.getClass().equals(toSearch)){
结果:添加(obj);
}else if(ContentAccessor的obj实例){
List children=((ContentAccessor)obj.getContent();
for(对象子对象:子对象){
addAll(getAllegementFromObject(child,toSearch));
}
}
返回结果;
}
私有静态void replaceTextElement(列表文本、字符串占位符、字符串newValue){
for(对象元素:文本){
Text Text元素=(Text)元素;
if(textElement.getValue().contains(占位符)){
字符串replacedValue=textElement.getValue().replaceAll(占位符,newValue);
textElement.setValue(replacedValue);
}
}
}

如果在XML中搜索并替换,则可以使用:

String xpath = "//w:r[w:t[contains(text(), 'placeholder')]]";
List<Object> list = wordMLPackage.getHeaderFooterPolicy().getDefaultHeader().getJAXBNodesViaXPath(xpath, false);
list.addAll(wordMLPackage.getHeaderFooterPolicy().getDefaultFooter().getJAXBNodesViaXPath(xpath, false));
stringxpath=“//w:r[w:t[contains(text(),'placeholder')]”;
List List=wordMLPackage.getHeaderFooterPolicy().getDefaultHeader().getJAXBNodesViaXPath(xpath,false);
addAll(wordMLPackage.getHeaderFooterPolicy().getDefaultFooter().getJAXBNodesViaXPath(xpath,false));
该列表包含存在占位符的所有节点。使用我在这里解释的方法获得占位符类型(文本、图片…)后(这是针对文本的,但很容易调整):

第一个链接的更新链接:
String xpath = "//w:r[w:t[contains(text(), 'placeholder')]]";
List<Object> list = wordMLPackage.getHeaderFooterPolicy().getDefaultHeader().getJAXBNodesViaXPath(xpath, false);
list.addAll(wordMLPackage.getHeaderFooterPolicy().getDefaultFooter().getJAXBNodesViaXPath(xpath, false));