首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用.docx创建docx4j时保留docx4j?

如何在使用.docx创建docx4j时保留docx4j?
EN

Stack Overflow用户
提问于 2015-01-27 17:35:45
回答 3查看 3.9K关注 0票数 3

我今天开始使用docx4j;

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

该内容的内部包含简单的,例如,列可能包含如下所示的字符串:

代码语言:javascript
复制
String content = "Hello&nbsp;<strong>Word</strong><br>";

如果我用createParagraphOfText()方法将这个字符串放入列中:

代码语言:javascript
复制
Tc tableCell = factory.createTc();    
tableCell.getContent().add(
    wordMLPackage.getMainDocumentPart().createParagraphOfText(content)
);
tableRow.getContent().add(tableCell);

它在文件一词中呈现为-(如预期的):

你好词组

我试图实现的是在文档中放置呈现的 HTML,以获得以下输出:

你好Word

我已经在StackOverflow和网络上搜索过,并且尝试了几乎所有找到的例子,但是这些信息是非常分散的,在深入挖掘之前,我想知道我是否在正确的方向上。

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-28 22:57:58

你可以选择:

  • 自己将(X)HTML转换为docx内容,或
  • 让言语去做吧

这样做可以让您更好地控制,并意味着下游处理将工作(如转换为PDF),而不必先打开docx在Word。

让Word来做这件事是AlternativeFormatInputPart (altChunk)的方法。

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

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

您可以使用其中一个“整洁”库将其转换为XHTML。由于有相当多的这些,我们留下您使用和如何配置它取决于您。

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

ConvertInXHTMLFragment.java就是一个例子。

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

docx4j-ImportXHTML依赖于此。

票数 3
EN

Stack Overflow用户

发布于 2015-02-02 13:43:58

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

代码语言:javascript
复制
String content = "Hello&nbsp;<strong>Word</strong><br>";

解决方案是将HTML封装到HTML元素中,例如。A div:

代码语言:javascript
复制
String content = "<div>" + content + "</div>";

并手动替换未封闭的空元素,例如:

代码语言:javascript
复制
content = content.replaceAll("<br>", "<br/>");

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

工作示例

代码语言:javascript
复制
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>";
票数 1
EN

Stack Overflow用户

发布于 2018-11-02 07:42:50

HTML文本的格式应该如下所示,在我的例子中,&nbsp;不起作用,所以我删除了它。

代码语言:javascript
复制
  String content = "<html>Hello <strong>Word</strong><br></html>";

XHTML用于将html转换为xhtml。

代码语言:javascript
复制
XHTMLImporter xHTMLImporter = new XHTMLImporterImpl(wordPackage);
        Tc tableCell = factory.createTc(); 

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

代码语言:javascript
复制
tableCell.getContent().add(wordMLPackage.getMainDocumentPart().
          getContent().addAll(xHTMLImporter.convert(content, null)));
        tableRow.getContent().add(tableCell);

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28176545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档