¿Cómo puedo convertir la lista anidada de XHTML a pdf con iText?

Tengo contenido XHTML, y tengo que crear desde este contenido un archivo PDF sobre la marcha. Yo uso el convertidor iText pdf. Probé de la manera más simple, pero siempre obtengo un resultado malo después de llamar al analizador XMLWorkerHelper.

XHTML:

  • First
    1. Second
    2. Second
  • First

El valor esperado:

  • primero
    1. Segundo
    2. Segundo
  • primero

Resultado en PDF:

  • Primero segundo segundo
  • primero

En el resultado, no hay una lista anidada. Necesito una solución para llamar al analizador y no crear una instancia del Documento iText.

Por favor, eche un vistazo al ejemplo NestedListHtml

En este ejemplo, tomo su código snippet list.html :

 
  • First
    1. Second
    2. Second
  • First

Y lo ElementList en una ElementList :

 // CSS CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true); // HTML HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); htmlContext.autoBookmark(false); // Pipelines ElementList elements = new ElementList(); ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null); HtmlPipeline html = new HtmlPipeline(htmlContext, end); CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); // XML Worker XMLWorker worker = new XMLWorker(css, true); XMLParser p = new XMLParser(worker); p.parse(new FileInputStream(HTML)); 

Ahora puedo agregar esta lista al Document :

 for (Element e : elements) { document.add(e); } 

O puedo incluir esta lista en un Paragraph :

 Paragraph para = new Paragraph(); for (Element e : elements) { para.add(e); } document.add(para); 

Obtendrás el resultado deseado como se muestra en nested_list.pdf

No puede agregar listas anidadas a un PdfPCell o a un ColumnText . Por ejemplo: esto no funcionará:

 PdfPTable table = new PdfPTable(2); table.addCell("Nested lists don't work in a cell"); PdfPCell cell = new PdfPCell(); for (Element e : elements) { cell.addElement(e); } table.addCell(cell); document.add(table); 

Esto se debe a una limitación en la clase ColumnText que ha estado allí durante muchos años. Hemos evaluado el problema y la única forma de solucionarlo sería reescribir ColumnText completo. Este no es un artículo en nuestro mapa de ruta técnica actual.