首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Docx4J从docx文件中获取页眉/页脚元素并对其进行修改

Docx4J从docx文件中获取页眉/页脚元素并对其进行修改
EN

Stack Overflow用户
提问于 2013-07-01 22:01:38
回答 3查看 8.6K关注 0票数 4

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

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

我正在使用

代码语言:javascript
复制
WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));
wordMLPackage.getMainDocumentPart(); 

要在模板中搜索元素,请执行以下操作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-02 06:24:36

Stack Overflow用户

发布于 2017-01-07 05:54:40

这就是我如何设法替换页脚上的键值持有者(在Java中,没有XML)。我遗漏的部分是:

代码语言:javascript
复制
JaxbXmlPart part = (JaxbXmlPart) relationshipPart.getPart(r);

来自JasonPlutext提到的源代码MailMerger.java,在第410行中说明。所以谢谢你,JasonPlutext

代码语言:javascript
复制
public static void replaceElementFromFooter(WordprocessingMLPackage template, String nameplace, String placeholder, String newValue) throws Docx4JException {
    List<Object> result = new ArrayList<Object>();

    RelationshipsPart relationshipPart = template.getMainDocumentPart().getRelationshipsPart();

    List<Relationship> relationships = relationshipPart.getRelationships().getRelationship()

    for (Relationship r : relationships) {

        if (r.getType().equals(nameplace)) {

            JaxbXmlPart part = (JaxbXmlPart) relationshipPart.getPart(r);

            List<Object> texts = getAllElementsFromObject(part.getContents(), Text.class);

            replaceTextElement(texts, placeholder, newValue);
        }

    }

    return result;
}

private static List<Object> getAllElementsFromObject(Object obj, Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();

    if (obj instanceof JAXBElement) {
        obj = ((JAXBElement<?>) obj).getValue();
    }

    if (obj.getClass().equals(toSearch)) {
        result.add(obj);
    } else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result;
}

private static void replaceTextElement(List<Object> texts, String placeholder, String newValue) {
    for (Object element : texts) {
        Text textElement = (Text) element;

        if (textElement.getValue().contains(placeholder)) {
            String replacedValue = textElement.getValue().replaceAll(placeholder, newValue);
            textElement.setValue(replacedValue);
        }

    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-05-16 17:10:21

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

代码语言:javascript
复制
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));

该列表包含占位符所在的所有节点。在获得占位符的类型(文本、图片...)之后使用我在这里解释的方法(它适用于文本,但很容易适应):replace_placeholder

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17406350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档