我的要求是使用docx4j将文档中的特定内容控件替换为HTML文本。我希望看到替换的文本以保留最终文档的格式。
我编写了一些代码,我能够识别要替换的标签/内容控件,但我无法找到任何逻辑来替换那里的 HTML 文本。任何帮助将不胜感激。请参阅下面我的代码
另外,如果我做错了什么,请告诉我。我的最终目标是拥有一个在不同位置具有多个内容控件以及静态文本的模板。生成文档时,所有内容控件都应替换为相应的 html 文本(可以长达一个段落)。
htmlText: \<p\>This is \<strong\>sample\</strong\> HTML \<u\>text\</u\>.
// Find specific content control element
try{
org.docx4j.wml.Document wmlDocumentEl = mainDocumentPart.getJaxbElement();
org.docx4j.wml.Body body = wmlDocumentEl.getBody();
List<Object> blockLevelElements = body.getEGBlockLevelElts();
int indexToReplace = -1;
for (int i = 0; i < blockLevelElements.size(); i++) {
Object o = blockLevelElements.get(i);
if (o instanceof SdtBlock) {
SdtBlock sdtBlock = (SdtBlock) o;
Tag tag = sdtBlock.getSdtPr().getTag();
if (tag != null && tag.getVal().equals(tagName)) {
indexToReplace = i;
break;
}
}
}
// Replace identified element with HTML text
if (indexToReplace != -1) {
blockLevelElements.remove(indexToReplace);
// Here we need logic to replace the identified tag with HTML text.
} else {
throw new RuntimeException("Content control with tag '" + tagName + "' not found.");
}
}
catch(Exception ex) {
oLog.error("Failed to replace Content Controls"+ ex);
}
您不需要重新发明轮子。 一般参见 https://opendope.org/approach_our.html 和 https://github.com/plutext/docx4j/blob/VERSION_11_5_0/docx4j-samples-docx4j/src/main/java/org/docx4j/samples /ContentControlBindingExtensions.java
根据https://github.com/plutext/docx4j/blob/VERSION_11_5_0/docx4j-core/src/main/resources/org/docx4j/model/datastorage/bind.xslt#L332如果您的w:sdtPr/ w:tag 包含 'od:ContentType=application/xhtml+xml' 它将使用 ImportXHTML(如果存在)来转换绑定内容。
但是,如果您确实想重新发明轮子,请在代码中遵循以下示例:https://github.com/plutext/docx4j-ImportXHTML/blob/VERSION_11_4_10/docx4j-ImportXHTML-samples/src/main/java/ org/docx4j/samples/ConvertInXHTMLFragment.java