Как исправить ошибку ‘0 уровень отсутствует для abstractListDefinition 0’ при использовании Emulator.getNumber()

#docx4j

#docx4j

Вопрос:

Я использовал docx4j для чтения файла docx. И мне нужно прочитать символы формата номера абзаца. Я использую Emulator.getNumber () для обработки, но я получил эту ошибку. Как мне с этим справиться?

 try {
     PPr pPr = ((P) p).getPPr();
     if (pPr != null amp;amp; 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:

html-вывод docx4j использует его следующим образом:

         // 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 amp;amp; 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 );                   
                }
            }