当前位置: 首页 > 知识库问答 >
问题:

Docx4j将html转换为docx

韦阳晖
2023-03-14

我在将HTML转换为docx时遇到了新问题,它引发了异常:

组织。xml。萨克斯。SAXS异常;行号:4;栏目号:73;实体“nbsp”已被引用,但未被声明

正如我所理解的,这是因为docx4j认为我的文件是XML,并希望将其转换为docx但XML中只有5个预定义的实体,而nbsp等实体没有在XML中定义。如何让docx4j将超文本标记语言转换为doc,而无需在doctype中声明实体nbsp?

是docx4j的不正确工作还是它的限制?

这是我的代码:

package ru.simplexsoftware.constructorOfDocuments.web.rest;
import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.exceptions.InvalidFormatException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.HttpRequestHandler;
import ru.simplexsoftware.constructorOfDocuments.dao.TemplateDao;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;


public class DocxFileDownloadServlet implements HttpRequestHandler {

@Autowired
TemplateDao templateDao;
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String parameter = request.getParameter("documentId");

    Long documentId = Long.parseLong(parameter);

    WordprocessingMLPackage wordMLPackage = null;
    try {
        wordMLPackage = WordprocessingMLPackage.createPackage();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    }

    NumberingDefinitionsPart ndp = null;
    try {
        ndp = new NumberingDefinitionsPart();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    }
    try {
        wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    }
    try {
        ndp.unmarshalDefaultNumbering();
    } catch (JAXBException e) {
        e.printStackTrace();
    }

    XHTMLImporterImpl xHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
    xHTMLImporter.setHyperlinkStyle("Hyperlink");

    String htmlString=templateDao.get(documentId).html;
    htmlString = htmlString.replaceAll("<br>","<br/>");
    InputStream stream = new ByteArrayInputStream(htmlString.getBytes(StandardCharsets.UTF_8.name()));
    // Convert the XHTML, and add it into the empty docx we made
    try {
        wordMLPackage.getMainDocumentPart().getContent().addAll(
                xHTMLImporter.convert(htmlString, null));
    } catch (Docx4JException e) {
        e.printStackTrace();
    }

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    try {
        wordMLPackage.save(outputStream);
    } catch (Docx4JException e) {
        e.printStackTrace();
    }


    response.setContentType("application/msword");
    response.getOutputStream().write(outputStream.toString().getBytes("UTF-8"));
    response.flushBuffer();

}
}

共有1个答案

白腾
2023-03-14

您可以尝试使用AltChunkType将HTML字符串插入docx段落

wordMLPackage.getMainDocumentPart().addAltChunk(AltChunkType.Xhtml, htmlString .getBytes());
 类似资料:
  • 我一直在尝试使用他们的库将html内容转换为docx,我确实在运行我的应用程序后创建了一个docx文件,但它有空白内容,而html中确实有一些内容。请检查下面的代码,我已经包含了git上AndroidDocxtoHTML示例中所有必要的库。 代码: 我不明白我得到的空白文档的代码中缺少了什么。我为java找到了这段代码,我为android修改了这段代码。有些人建议使用夜间构建jar进行xhtml转

  • (*来自http://www.docx4java.org/forums/xhtml-import-f28/html-docx-html-inserts-a-lot-of-space-t1966.html#p6791?sid=78b64a02482926c4dbdbbafbf50d0a914将在应答时更新) 我已经创建了一个html测试文档,其内容如下: 然后,我的代码从这个html创建一个docx

  • 我有一个应用程序试图拉一些数据从数据库,然后保存在一个docx文件。这些数据的一部分是html代码,因此使用docx4j,我能够将html代码转换为docx格式。这里有一个相关的帖子。 现在,我想使用docx4j将这部分文本(在docx文件的表单元格中)转换回html格式,并将html代码保存到数据库中。 或者也许有更好的解决方案来完成从docx到HTML的转换?希望我说清楚了。任何提示都很感激。

  • 我对docx4j样本有一些问题。我需要转换一个文件从docx在html格式和回来。我正在尝试编译ConvertInXHTMLDocument。java示例。它创建的Html文件很好,但当试图将其转换回docx时,抛出一个缺少关闭标记(META、img等)的异常。有人遇到过这个问题吗?

  • null 很抱歉,我无法发布我尝试过的任何内容,因为我还没有在此任务上尝试过任何内容,尽管我使用将从获得的转换为,以便在应用程序的中输出。请开导我,我在压力和困惑中迷失了……!