使用Emulator.getNumber()时如何解决'abstractListDefinition 0缺少0级别错误

时间:2019-04-17 06:04:26

标签: docx4j

我使用docx4j读取docx文件。而且我需要阅读段落编号格式字符。我使用Emulator.getNumber()进行处理,但出现此错误。我应该如何处理?

try {
     PPr pPr = ((P) p).getPPr();
     if (pPr != null && pPr.getNumPr() != null) {
         Emulator.ResultTriple triple = Emulator.getNumber(wordprocessingMLPackage, pPr);
         if (triple != null) {
              order = triple.getNumString();
         }
     }
 } catch (Exception e) {
     // throw error '0 level missing for abstractListDefinition 0'
     e.printStackTrace();
 }

任何帮助将不胜感激。

docx4j版本:6.1.2

1 个答案:

答案 0 :(得分:0)

docx4j的html输出使用它的方式如下:

        // Numbering
        String numberText=null;
        String numId=null;
        String levelId=null;
        if (pPrDirect.getNumPr()!=null) {
            numId = pPrDirect.getNumPr().getNumId()==null ? null : pPrDirect.getNumPr().getNumId().getVal().toString(); 
            levelId = pPrDirect.getNumPr().getIlvl()==null ? null : pPrDirect.getNumPr().getIlvl().getVal().toString(); 
        }

        ResultTriple triple = org.docx4j.model.listnumbering.Emulator.getNumber(
                conversionContext.getWmlPackage(), pStyleVal, numId, levelId);   


        if (triple==null) {
            getLog().debug("computed number ResultTriple was null");
        } else {
            if (triple.getBullet() != null) {
                //numberText = (triple.getBullet() + " ");
                numberText = "\u2022  "; 
            } else if (triple.getNumString() == null) {
                getLog().error("computed NumString was null!");
                numberText = ("?");
            } else {
                numberText = (triple.getNumString() + " ");
            }
        }
        if (numberText!=null) {
            currentParent.appendChild(document.createTextNode(
                    numberText + " "));             
        }

XSL-FO输出:

            if (pPrDirect!=null && pPrDirect.getNumPr()!=null) {
                triple = org.docx4j.model.listnumbering.Emulator.getNumber(
                    conversionContext.getWmlPackage(), pStyleVal, 
                    pPrDirect.getNumPr().getNumId().getVal().toString(), 
                    pPrDirect.getNumPr().getIlvl().getVal().toString() ); 
            } else {
                // Get the effective values; since we already know this,
                // save the effort of doing this again in Emulator
                Ilvl ilvl = pPr.getNumPr().getIlvl();
                String ilvlString = ilvl == null ? "0" : ilvl.getVal().toString();
                triple = null; 
                if (pPr.getNumPr().getNumId()!=null) {
                    triple = org.docx4j.model.listnumbering.Emulator.getNumber(
                            conversionContext.getWmlPackage(), pStyleVal, 
                            pPr.getNumPr().getNumId().getVal().toString(), 
                            ilvlString );                   
                }
            }