3

我今天开始使用 docx4j;

我已经成功地创建了一个带有表格的文档,其中包含来自外部来源的内容。

此内容内部包含简单的HTML,例如,列可能包含如下字符串:

String content = "Hello&nbsp;<strong>Word</strong><br>";

如果我使用以下方法将此字符串放在列中createParagraphOfText()

Tc tableCell = factory.createTc();    
tableCell.getContent().add(
    wordMLPackage.getMainDocumentPart().createParagraphOfText(content)
);
tableRow.getContent().add(tableCell);

它在 Word 文档中按原样呈现(如预期的那样):

Hello&nbsp;<strong>Word</strong><br>

我想要实现的是将呈现的HTML 放入文档中,以获得以下输出:

你好


我在 StackOverflow 和 Web 上进行了搜索,并尝试了几乎所有找到的示例,但信息非常零散,在更深入地挖掘之前,我至少想知道我的方向是否正确。

我已将docx4j-ImportXHTMLjar 添加到 Maven,但在文档中它声明内容必须是格式良好的XHTML,而我只有一堆文本和 HTML 混合在一起。

使用它的许多(少数)示例还包括将现有的 XML 文件转换为 docx,而我很擅长手动完全创建 docx,并且只需要呈现包含 HTML 的单个字符串。这个模块可以吗?

我还看到还有其他 docx4j 模块(例如。xhtmlrenderer),但我不确定哪个是好的模块。

有人知道在迭代期间在表格(单元格)中添加 HTML 块的正确过程吗?

4

3 回答 3

3

您可以选择:

  • 自己将 (X)HTML 转换为 docx 内容,或
  • 让 Word 来做

自己做可以让您更好地控制,意味着下游处理将起作用(例如转换为 PDF),而无需先在 Word 中打开 docx。

让 Word 来做是 AlternativeFormatInputPart (altChunk) 方法。

如果可以的话,我的建议是自己做。我建议您为此使用 docx4j-ImportXHTML。

我已将 docx4j-ImportXHTML jar 添加到 Maven,但在文档中它声明内容必须是格式正确的 XHTML,而我只有一堆文本和 HTML 混合在一起。

您可以使用其中一个“整洁”的库来转换为 XHTML。由于其中有很多,我们将您使用哪个以及如何配置它留给您。

只需要渲染一个包含 HTML 的字符串。这个模块可以吗?

ConvertInXHTMLFragment.java就是一个例子。

我还看到还有其他 docx4j 模块(例如 xhtmlrenderer),但我不确定哪个是好的模块。

docx4j-ImportXHTML 依赖于此。

于 2015-01-28T22:57:58.063 回答
1

如果你有简单的 HTML 而不是 XHTML,比如

String content = "Hello&nbsp;<strong>Word</strong><br>";

解决方案是将您的 HTML 封装到一个 HTML 元素中,例如。一个div:

String content = "<div>" + content + "</div>";

并手动替换未闭合的 void 元素,例如:

content = content.replaceAll("<br>", "<br/>");

此时,您可能会收到无法识别的 HTML 实体的错误,例如拉丁重音符号(&agrave;等等)。然后,您可以使用带有 DTD 声明而不是 div 的 HTML 文档来包围您的代码。故事结局。

工作示例

private void whatever(){

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    pkg = WordprocessingMLPackage.createPackage(PageSizePaper.A4,true);
    factory = Context.getWmlObjectFactory();

    Tbl table = factory.createTbl();
    for (Item item : Items){       
        Tr tableRow = factory.createTr();
        Tc tableCell = factory.createTc();

        /* This is the core of the problem */
        String content = wrapXHTML(item.getContent());
        List<Object> objects = importer.convert(wrapToXHTML(content), null);
        tableCell.getContent().addAll(objects);     
        /* problem solved */

        tableRow.getContent().add(tableCell);
        table.getContent().add(tableRow);
    }        
    pkg.getMainDocumentPart().addObject(table);
    pkg.save(baos);
}

private String wrapXHTML(String content) {
    content = content.replaceAll("<br>", "<br/>");
    /* ... other substitutions ... */

    return dtd + html + head + start + content + end;
}

private final static String dtd = 
                     "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
                     + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
private final static String html = "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
private final static String head = "<head></head>";
private final static String start = "<body><div>";
private final static String end = "</div></body></html>";
于 2015-02-02T13:43:58.437 回答
-1

HTML 文本的格式应如下所示,在我的情况下&nbsp;不起作用,因此我将其删除。

  String content = "<html>Hello <strong>Word</strong><br></html>";

XHTML 用于将 html 转换为 xhtml

XHTMLImporter xHTMLImporter = new XHTMLImporterImpl(wordPackage);
        Tc tableCell = factory.createTc(); 

这是您在代码中需要的更改

tableCell.getContent().add(wordMLPackage.getMainDocumentPart().
          getContent().addAll(xHTMLImporter.convert(content, null)));
        tableRow.getContent().add(tableCell);

这段代码对我有用,请试试这个。

于 2018-11-02T07:42:50.270 回答