docx4j:使用Java读取docx文件的两个书签之间的数据

时间:2018-10-24 03:07:08

标签: java docx bookmarks docx4j

我正在执行一项任务,其中需要使用Java 读取docx文件的两个书签之间的数据。 我使用下面的代码使用docx4j api获得了书签的所有名称-

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(file.getPath()));
MainDocumentPart tempDocPart = wordMLPackage.getMainDocumentPart();
List<Object> obj = wordMLPackage.getMainDocumentPart().getContent();

RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
    new TraversalUtil(obj, rt);
    for (CTBookmark bm : rt.getStarts()) {
        if(bm.getName().equals("bookmarkstart1")){
            System.out.println(bm.getName());

        }
    }

我的docx文件书签名称,例如bookmarkstart1bookmarkend1bookmarkstart2bookmarkend2 ...,依此类推。 我需要读取bookmarkstart1bookmarkend1之间的数据。

感谢您的帮助。

enter image description here

2 个答案:

答案 0 :(得分:0)

我以前做过。有我的解决方案:

  1. 您已经有了目标书签开始标记对象CTBookmark start

  2. 您可以通过P p = (P) start.getParent()获取其父对象,其父对象应该是P的实例。

  3. List<Object> content = p.getContent(),获取P标签的内容,书签的开始标签和结束标签都应该在其中,然后您可以获得想要的东西。

ps。 P内容中的书签标签对象可能是JAXBElement的实例,可以使用XmlUtil.unwrap()强制转换为CTBookmark。
请记住,结束标签与开始标签具有相同的ID。

答案 1 :(得分:-1)

像这样

private void getConten(WordprocessingMLPackage wordMLPackage){
    MainDocumentPart tempDocPart = wordMLPackage.getMainDocumentPart();
    List<Object> obj = wordMLPackage.getMainDocumentPart().getContent();

    RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
    new TraversalUtil(obj, rt);
    CTBookmark start = null;
    List<CTMarkupRange> ends = rt.getEnds();
    for (CTBookmark bm : rt.getStarts()) {
        if(bm.getName().equals("targetBookmarkName")){
            start = bm;
            break;
        }
    }
    if(start == null){
        return;
    }
    Object parent = start.getParent();
    if(!( parent instanceof P)){
        return;
    }
    List<Object> content = ((P) parent).getContent();
    int startIndex = -1;
    int endIndex = -1;
    BigInteger startId = start.getId();
    for (int i = 0; i < content.size(); i++) {
        Object o = content.get(i);
        if(o == start){
            startIndex = i;
        }else if(o instanceof CTMarkupRange){
            if(startId.equals(((CTMarkupRange)o).getId())){
                endIndex = i;
                break;
            }
        }else if(o instanceof JAXBElement){
            Object unwrap = XmlUtils.unwrap(o);
            if(unwrap instanceof CTBookmark){
                // start tag
                if(startId.equals(((CTBookmark)unwrap).getId()){
                    startIndex = i;
                }
            }else if(unwrap instanceof CTMarkupRange){
                // end tag
                if(startId.equals(((CTMarkupRange)unwrap).getId())){
                    endIndex = i;
                }
            }
        }
    }
    if(startIndex < 0 || endIndex < 0){
        // content not found
        return;
    }
    List<Object> betweenContent = content.subList(startIndex, endIndex);

}