При импорте многоуровневого списка из xhtml в docx генерируется несколько конкретных списков для одного нумерованного списка. - PullRequest
0 голосов
/ 13 марта 2019

Мне нужно импортировать многоуровневый нумерованный список из xhtml в docx. При импорте списка в docx создается один абстрактный список в NumberingDefinitionsPart. Абстрактный список определяет стиль нумерованного списка, и он должен быть одинаковым для всех элементов списка. Но для некоторых элементов списка разные конкретные списки с разными NumId генерируются в NumberingDefinitionsPart. Конкретные списки переопределяют стиль нумерованного списка, определенный в абстрактном списке. Но нет необходимости менять стиль в нумерованном списке, так как он один и тот же. Ниже приведен xhtml оригинального нумерованного списка:

<ol>
    <li>level 1
    <ol>
        <li>level 1.1</li>
    </ol>
    </li>
    <li>level 2
    <ol>
        <li>level 2.1</li>
        <li>level 2.2</li>
    </ol>
    </li>
</ol>

После преобразования в docx конвертируется в такой контент:

<w:p>
    <w:pPr>
        <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="3"/>
        </w:numPr>
        <w:spacing w:after="0"/>
    </w:pPr>
    <w:r>
        <w:t>level 1</w:t>
    </w:r>
</w:p>
<w:p>
    <w:pPr>
        <w:numPr>
            <w:ilvl w:val="1"/>
            <w:numId w:val="3"/>
        </w:numPr>
        <w:spacing w:after="0"/>
    </w:pPr>
    <w:r>
        <w:t>level 1.1</w:t>
    </w:r>
</w:p>
<w:p>
    <w:pPr>
        <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="3"/>
        </w:numPr>
        <w:spacing w:after="0"/>
    </w:pPr>
    <w:r>
        <w:t>level 2</w:t>
    </w:r>
</w:p>
<w:p>
    <w:pPr>
        <w:numPr>
            <w:ilvl w:val="1"/>
            <w:numId w:val="4"/>
        </w:numPr>
        <w:spacing w:after="0"/>
    </w:pPr>
    <w:r>
        <w:t>level 2.1</w:t>
    </w:r>
</w:p>
<w:p>
    <w:pPr>
        <w:numPr>
            <w:ilvl w:val="1"/>
            <w:numId w:val="4"/>
        </w:numPr>
        <w:spacing w:after="0"/>
    </w:pPr>
    <w:r>
        <w:t>level 2.2</w:t>
    </w:r>
</w:p>

Таким образом, для элементов списка вплоть до "уровня 4" его w: numId равно 3, но начиная с элемента "уровня 4.1" его w: numId равно 4. Это не ясно, поскольку нумерация одинакова и стиль нумерации не должен были изменены. В результате при экспорте нумерованного списка обратно в xhtml нумерация элементов списка прерывается и перезапускается с 0 при изменении конкретного списка.

Версия Docx4j - 6.1.2, xHTMLImporter вызывается следующим образом:

String strRich;//string with xhtml
StringBuilder sb = new StringBuilder();
sb.append("<html>").append("<head>").append("<style type='text/css'>")
.append("h1, h2, h3, h4, h5, h6{ font-size:12pt;}")
.append("body { font-size:12pt;}")
.append("</style>").append("</head>")
.append("<body>")
.append(strRich)
.append("</body>")
.append("</html>");
XHTMLImporterImpl xHTMLImporter = new XHTMLImporterImpl(inwordMLPackage);
xHTMLImporter.setRunFormatting(FormattingOption.IGNORE_CLASS);
xHTMLImporter.setTableFormatting(FormattingOption.IGNORE_CLASS);
xHTMLImporter.setHyperlinkStyle("Hyperlink");
List<Object> addhtml = xHTMLImporter.convert(sb.toString(), null);
...